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