cfae5694491412ff04e5fb481f5e610703da3d7e
[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.1  1995-05-15 12:12:22  quinn
8  * Request queue.
9  *
10  *
11  */
12
13 /*
14  * Simple queue management.
15  *
16  * We also use the request-freelist to store encoding buffers, rather than
17  * freeing and malloc'ing them on each cycle.
18  */
19
20 #include <stdlib.h>
21
22 #include <dmalloc.h>
23 #include <session.h>
24
25 static request *request_list = 0;  /* global freelist for requests */
26
27 void request_enq(request_q *q, request *r)
28 {
29     if (q->tail)
30         q->tail->next = r;
31     else
32         q->head = r;
33     q->tail = r;
34     q->num++;
35 }
36
37 request *request_head(request_q *q)
38 {
39     return q->head;
40 }
41
42 request *request_deq(request_q *q)
43 {
44     request *r = q->head;
45
46     if (!r)
47         return 0;
48     q->head = q->head->next;
49     if (!q->head)
50         q->tail = 0;
51     q->num--;
52     return r;
53 }
54
55 void request_initq(request_q *q)
56 {
57     q->head = q->tail = 0;
58     q->num = 0;
59 }
60
61 request *request_get(void)
62 {
63     request *r = request_list;
64
65     if (r)
66         request_list = r->next;
67     else
68     {
69         if (!(r = malloc(sizeof(*r))))
70             abort();
71         r->response = 0;
72         r->size_response = 0;
73     }
74     r->len_refid = 0;
75     r->request = 0;
76     r->request_mem = 0;
77     r->len_response = 0;
78     r->state = REQUEST_IDLE;
79     r->next = 0;
80     return r;
81 }
82
83 void request_release(request *r)
84 {
85     r->next = request_list;
86     request_list = r;
87 }