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