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