down-before-busy-20040723
[openafs.git] / src / WINNT / afsd / queue95.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* queue.c
11  *
12  * Generic queue for use with Windows 95/DJGPP disk cache
13  *
14  ************************************************************************/
15
16 #ifdef DISKCACHE95
17
18 #define NULL 0
19 #include "queue95.h"
20 #include <stdio.h>
21
22 void QInit(Queue *queue)
23 {
24   queue->head = NULL;
25   queue->tail = NULL;
26   queue->currpos = NULL;
27 }
28
29 void QAddT(Queue *queue, QLink* node, int ord)
30 {
31   /*QLink* node = new QLink;*/
32
33   /*node->item = x;*/
34   node->ord = ord;
35   node->next = NULL;
36   node->prev = NULL;
37   if (!queue->tail)
38     queue->head = queue->tail = node;
39   else {
40     queue->tail->next = node;
41     queue->tail = node;
42     node->prev = queue->tail;
43   }
44   queue->size++;
45 }
46
47 void QAddH(Queue *queue, QLink *node, int ord)
48 {
49   node->ord = ord;
50   node->next = NULL;
51   node->prev = NULL;
52   if (!queue->head)
53     queue->head = queue->tail = node;
54   else {
55     node->next = queue->head;
56     queue->head->prev = node;
57     queue->head = node;
58   }
59   queue->size++;
60 }
61            
62 void QAddOrd(Queue *queue, QLink *node, int ord)
63 {
64   /*QLink<T>* node = new QLink<T>;*/
65   QLink* p, *prev;
66
67   node->ord = ord;
68   node->next = NULL;
69   node->prev = NULL;
70   if (!queue->tail)
71     queue->head = queue->tail = node;
72   else {
73     p = queue->head;
74     while (p && ord >= p->ord) {    /* add towards tail end if equals found */
75       prev = p;
76       p = p->next;
77     }
78     if (p == queue->head) {
79       QAddH(queue, node, ord);
80     }
81     else if (p == NULL) {
82       QAddT(queue, node, ord);
83     }
84     else {
85       node->next = p;
86       node->prev = prev;
87       prev->next = node;
88     }
89   }
90   queue->size++;
91 }
92
93 QLink* QServe(Queue *queue)
94 {
95   QLink *n = queue->head;
96
97   if (!queue->head) return NULL;
98   if (queue->head == queue->tail)
99     queue->head = queue->tail = NULL;
100   else
101     queue->head = n->next;
102   queue->size--;
103   return n;
104 }
105
106 void QMoveToTail(Queue *queue, QLink *n, int ord)
107 {
108   QRemove(queue, n);
109   QAddT(queue, n, ord);
110 }
111
112 void QRemove(Queue *queue, QLink *n)
113 {
114   /*QLink* n2 = NULL;*/
115
116   if (!queue->head) return;
117   /*while(n && n != x) {
118     n2 = n;
119     n = n->next;
120     }*/
121   if (n == queue->currpos) {
122     if (n == queue->head) queue->currpos = n->next;
123     if (n == queue->tail) queue->currpos = n->prev;
124     if (n->prev) queue->currpos = n->prev;
125   }
126
127   if (n->prev)
128   {
129     /*assert(n->prev->next == n);*/
130     n->prev->next = n->next;
131   }
132   else
133     queue->head = n->next;
134
135   if (n->next)
136   {
137     /*assert(n->next->prev == n);*/
138     n->next->prev = n->prev;
139   }
140   else
141     queue->tail = n->prev;
142   
143   queue->size--;
144 }
145
146 QLink *QCurrent(Queue *queue)
147 {
148   /*if (currpos) return currpos->item;
149     else return NULL;*/
150   return queue->currpos;
151 }
152
153 void QIterate(Queue *queue)
154 {
155   QLink* node;
156
157   node = queue->head;
158   while (node) {
159     printf("node=%x, ord=%f\n", node, node->ord);
160     node = node->next;
161   }
162   fflush(stdout);
163 }
164
165 #endif /* DISKCACHE95 */