*** empty log message ***
[yaz-moved-to-github.git] / server / requestq.c
1 /*
2  * Copyright (C) 1994-1998, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: requestq.c,v $
7  * Revision 1.6  1998-02-11 11:53:35  adam
8  * Changed code so that it compiles as C++.
9  *
10  * Revision 1.5  1998/02/10 11:03:56  adam
11  * Added support for extended handlers in backend server interface.
12  *
13  * Revision 1.4  1997/10/27 13:55:03  adam
14  * Fixed memory leak: member response wasn't freed when queue
15  * was destroyed.
16  *
17  * Revision 1.3  1997/09/01 08:53:00  adam
18  * New windows NT/95 port using MSV5.0. The test server 'ztest' was
19  * moved a separate directory. MSV5.0 project server.dsp created.
20  * As an option, the server can now operate as an NT service.
21  *
22  * Revision 1.2  1995/11/01 13:54:57  quinn
23  * Minor adjustments
24  *
25  * Revision 1.1  1995/05/15  12:12:22  quinn
26  * Request queue.
27  *
28  *
29  */
30
31 /*
32  * Simple queue management.
33  *
34  * We also use the request-freelist to store encoding buffers, rather than
35  * freeing and xmalloc'ing them on each cycle.
36  */
37
38 #include <stdlib.h>
39
40 #include <xmalloc.h>
41 #include "session.h"
42
43 void request_enq(request_q *q, request *r)
44 {
45     if (q->tail)
46         q->tail->next = r;
47     else
48         q->head = r;
49     q->tail = r;
50     q->num++;
51 }
52
53 request *request_head(request_q *q)
54 {
55     return q->head;
56 }
57
58 request *request_deq(request_q *q)
59 {
60     request *r = q->head;
61
62     if (!r)
63         return 0;
64     q->head = q->head->next;
65     if (!q->head)
66         q->tail = 0;
67     q->num--;
68     return r;
69 }
70
71 void request_initq(request_q *q)
72 {
73     q->head = q->tail = q->list = 0;
74     q->num = 0;
75 }
76
77 void request_delq(request_q *q)
78 {
79     request *r1, *r = q->list;
80     while (r)
81     {
82         xfree (r->response);
83         r1 = r;
84         r = r->next;
85         xfree (r1);
86     }
87 }
88
89 request *request_get(request_q *q)
90 {
91     request *r = q->list;
92
93     if (r)
94         q->list = r->next;
95     else
96     {
97         if (!(r = (request *)xmalloc(sizeof(*r))))
98             abort();
99         r->response = 0;
100         r->size_response = 0;
101     }
102     r->q = q;
103     r->len_refid = 0;
104     r->refid = 0;
105     r->request = 0;
106     r->request_mem = 0;
107     r->len_response = 0;
108     r->clientData = 0;
109     r->state = REQUEST_IDLE;
110     r->next = 0;
111     return r;
112 }
113
114 void request_release(request *r)
115 {
116     request_q *q = r->q;
117     r->next = q->list;
118     q->list = r;
119 }
120