2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #include <afsconfig.h>
16 #include <afs/bubasics.h>
17 #include "bucoord_prototypes.h"
20 int dlqCount(dlqlinkP );
21 void dlqMoveb( dlqlinkP, dlqlinkP);
22 dlqlinkP dlqUnlinkb(dlqlinkP );
23 dlqlinkP dlqUnlinkf(dlqlinkP );
24 dlqlinkP dlqFront(dlqlinkP headptr);
26 #define DLQ_ASSERT_HEAD(headptr) \
27 if ( (headptr)->dlq_type != DLQ_HEAD ) \
29 printf("file %s line %d, invalid queue head\n", \
30 __FILE__, __LINE__); \
41 int dlqEmpty(dlqlinkP headptr )
43 DLQ_ASSERT_HEAD(headptr);
44 if (headptr->dlq_next == headptr)
49 int dlqInit(dlqlinkP headptr)
51 headptr->dlq_next = headptr;
52 headptr->dlq_prev = headptr;
53 headptr->dlq_type = DLQ_HEAD;
54 headptr->dlq_structPtr = NULL;
59 * link item to front of chain
61 int dlqLinkf(dlqlinkP headptr, dlqlinkP entryptr)
63 DLQ_ASSERT_HEAD(headptr);
64 /* link in as first item in chain */
65 entryptr->dlq_next = headptr->dlq_next;
66 headptr->dlq_next->dlq_prev = entryptr;
67 entryptr->dlq_prev = headptr;
68 headptr->dlq_next = entryptr;
73 * link item to end of chain
76 int dlqLinkb(dlqlinkP headptr, dlqlinkP entryptr)
78 DLQ_ASSERT_HEAD(headptr);
79 entryptr->dlq_next = headptr;
80 entryptr->dlq_prev = headptr->dlq_prev;
82 headptr->dlq_prev = entryptr;
83 entryptr->dlq_prev->dlq_next = entryptr;
88 * move all the items on the fromptr and append to the toptr's list
91 void dlqMoveb( dlqlinkP fromptr, dlqlinkP toptr)
95 DLQ_ASSERT_HEAD(fromptr);
96 DLQ_ASSERT_HEAD(toptr);
98 if (dlqEmpty(fromptr))
101 tailptr = toptr->dlq_prev;
103 tailptr->dlq_next = fromptr->dlq_next;
104 tailptr->dlq_next->dlq_prev = tailptr;
106 /* now fix up the last item in the new chain */
107 tailptr = fromptr->dlq_prev;
109 tailptr->dlq_next = toptr;
110 toptr->dlq_prev = tailptr;
112 fromptr->dlq_next = fromptr;
113 fromptr->dlq_prev = fromptr;
118 * unlink the last item on the queue
121 dlqlinkP dlqUnlinkb(dlqlinkP headptr)
124 DLQ_ASSERT_HEAD(headptr);
126 if (dlqEmpty(headptr))
129 ptr = headptr->dlq_prev;
130 ptr->dlq_prev->dlq_next = headptr;
131 headptr->dlq_prev = ptr->dlq_prev;
139 * unlink the item on the front of the queue
142 dlqlinkP dlqUnlinkf(dlqlinkP headptr)
145 DLQ_ASSERT_HEAD(headptr);
147 if (dlqEmpty(headptr))
150 ptr = headptr->dlq_next;
152 headptr->dlq_next = ptr->dlq_next;
153 ptr->dlq_next->dlq_prev = headptr;
161 * unlink the specified item from the queue.
164 void dlqUnlink( dlqlinkP ptr)
166 /* must not be the queue head */
167 if (ptr->dlq_type == DLQ_HEAD) {
168 printf("dlqUnlink: invalid unlink\n");
172 ptr->dlq_prev->dlq_next = ptr->dlq_next;
173 ptr->dlq_next->dlq_prev = ptr->dlq_prev;
180 * return point to item at front of queuen
183 dlqlinkP dlqFront(dlqlinkP headptr)
185 DLQ_ASSERT_HEAD(headptr);
187 if (dlqEmpty(headptr))
190 return (headptr->dlq_next);
193 int dlqCount(dlqlinkP headptr)
198 DLQ_ASSERT_HEAD(headptr);
200 ptr = headptr->dlq_next;
201 while (ptr != headptr) {
208 int dlqTraverseQueue(dlqlinkP headptr, int (*fn1)(void *), int (*fn2)(void *))
210 dlqlinkP ptr, oldPtr;
212 DLQ_ASSERT_HEAD(headptr);
214 ptr = headptr->dlq_next;
215 while (ptr != headptr) {
216 if (fn2 && ptr->dlq_structPtr)
217 (*fn2) (ptr->dlq_structPtr);