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