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