2 * This file is part of DZComm.
4 * General purpose FIFO queue functions set.
5 * Copyright (c) 1997 Dim Zegebart, Moscow Russia.
6 * zager@post.comstar.ru
7 * http://www.geocities.com/siliconvalley/pines/7817
11 #include <stdlib.h> /* NULL */
15 typedef unsigned int uint;
16 typedef unsigned short int usint;
17 typedef unsigned char byte;
19 #define QH(q) q->queue+q->head
20 #define QT(q) q->queue+q->tail
22 //------------------------- FIFO QUEUE -----------------------------
23 // 'first in first out' queue functions
25 inline void queue_reset(fifo_queue *q)
29 END_OF_FUNCTION(queue_reset);
32 int queue_resize(fifo_queue *q,uint new_size)
34 if ((tmp=(int*)realloc(q->queue,sizeof(int)*new_size))==NULL) return(0);
36 if (new_size>q->size) q->resize_counter++;
37 else if (new_size<=q->initial_size) q->resize_counter=0;
38 else q->resize_counter--;
42 q->fill_level=3*(q->size>>2); // 3/4
46 //-------------------- QUEUE_DELETE --------------------------
48 void queue_delete(fifo_queue *q)
49 { if (q==NULL) return;
54 //--------------------- QUEUE_PUT ------------------------------
56 inline int queue_put(fifo_queue *q,int c)
57 { return(queue_put_(q,&c));
59 END_OF_FUNCTION(queue_put);
61 int queue_put_(fifo_queue *q,void *c)
67 memcpy(QT(q),c,q->dsize);
71 if (q->head>(q->size-q->dsize)) q->head=0;
74 if(q->tail>(q->size-q->dsize)) q->tail=0;
77 if (q->head<q->tail) {if ((q->tail-q->head)>=q->fill_level) n=1;}
79 if ((q->head-q->tail)<=q->size-q->fill_level) n=1;
85 END_OF_FUNCTION(queue_put_);
87 //---------------------- QUEUE GET ---------------------------
89 inline int queue_get(fifo_queue *q)
94 END_OF_FUNCTION(queue_get);
96 int queue_get_(fifo_queue *q,void *c)
101 memcpy(c,QH(q),q->dsize);
104 if (q->head>(q->size-q->dsize)) q->head=0;
105 if (q->head==q->tail) queue_reset(q);
108 if (q->head<q->tail) {if ((q->tail-q->head)>=q->fill_level) n=1;}
110 if ((q->head-q->tail)<=q->size-q->fill_level) n=1;
115 END_OF_FUNCTION(queue_get_);
116 //---------------------- QUEUE EMPTY ---------------------------
118 inline int queue_empty(fifo_queue *q)
119 { if (q==NULL) return(1);
120 if (q->head==q->tail)
121 { if (q->empty_handler!=NULL) return(-1);
126 END_OF_FUNCTION(queue_empty);
129 //------------------------------- QUEUE NEW --------------------------
131 fifo_queue* queue_new(uint size)
133 return(queue_new_(size,4));
136 //------------------------- QUEUE_NEW_ --------------------------
138 fifo_queue* queue_new_(uint size,uint dsize)
139 { fifo_queue *q=NULL;
141 if (dsize<=0||dsize>4) return(NULL);
142 if ((q=(fifo_queue*)malloc(sizeof(fifo_queue)))==NULL) return(NULL);
144 if (!size) size=1024; //if illegal size, turn it to default size
145 if ((q->queue=malloc(sizeof(int)*size*dsize))==NULL) return(NULL);
149 q->initial_size=size*dsize;//size;
151 q->fill_level=3*q->size/4; // 3/4
152 q->empty_handler=NULL;
154 _go32_dpmi_lock_data(q->queue,sizeof(int)*size*dsize);
155 _go32_dpmi_lock_data(q,sizeof(fifo_queue));
160 void lock_queue_functions(void)
162 LOCK_FUNCTION(queue_empty);
163 LOCK_FUNCTION(queue_put);
164 LOCK_FUNCTION(queue_get);
165 LOCK_FUNCTION(queue_put_);
166 LOCK_FUNCTION(queue_get_);
167 LOCK_FUNCTION(queue_reset);