Add odr_prepend()
[yaz-moved-to-github.git] / src / requestq.c
1 /*
2  * Copyright (C) 1994-2003, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Id: requestq.c,v 1.1 2003-10-27 12:21:35 adam Exp $
7  *
8  */
9
10 /*
11  * Simple queue management.
12  *
13  * We also use the request-freelist to store encoding buffers, rather than
14  * freeing and xmalloc'ing them on each cycle.
15  */
16
17 #include <stdlib.h>
18
19 #include <yaz/xmalloc.h>
20 #include "session.h"
21
22 void request_enq(request_q *q, request *r)
23 {
24     if (q->tail)
25         q->tail->next = r;
26     else
27         q->head = r;
28     q->tail = r;
29     q->num++;
30 }
31
32 request *request_head(request_q *q)
33 {
34     return q->head;
35 }
36
37 request *request_deq(request_q *q)
38 {
39     request *r = q->head;
40
41     if (!r)
42         return 0;
43     q->head = q->head->next;
44     if (!q->head)
45         q->tail = 0;
46     q->num--;
47     return r;
48 }
49
50 void request_initq(request_q *q)
51 {
52     q->head = q->tail = q->list = 0;
53     q->num = 0;
54 }
55
56 void request_delq(request_q *q)
57 {
58     request *r1, *r = q->list;
59     while (r)
60     {
61         xfree (r->response);
62         r1 = r;
63         r = r->next;
64         xfree (r1);
65     }
66 }
67
68 request *request_get(request_q *q)
69 {
70     request *r = q->list;
71
72     if (r)
73         q->list = r->next;
74     else
75     {
76         if (!(r = (request *)xmalloc(sizeof(*r))))
77             abort();
78         r->response = 0;
79         r->size_response = 0;
80     }
81     r->q = q;
82     r->len_refid = 0;
83     r->refid = 0;
84     r->gdu_request = 0;
85     r->apdu_request = 0;
86     r->request_mem = 0;
87     r->len_response = 0;
88     r->clientData = 0;
89     r->state = REQUEST_IDLE;
90     r->next = 0;
91     return r;
92 }
93
94 void request_release(request *r)
95 {
96     request_q *q = r->q;
97     r->next = q->list;
98     q->list = r;
99 }
100