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>
20 #include <afs/bubasics.h>
21 #include "bucoord_prototypes.h"
24 int dlqCount(dlqlinkP );
25 void dlqMoveb( dlqlinkP, dlqlinkP);
26 dlqlinkP dlqUnlinkb(dlqlinkP );
27 dlqlinkP dlqUnlinkf(dlqlinkP );
28 dlqlinkP dlqFront(dlqlinkP headptr);
30 #define DLQ_ASSERT_HEAD(headptr) \
31 if ( (headptr)->dlq_type != DLQ_HEAD ) \
33 printf("file %s line %d, invalid queue head\n", \
34 __FILE__, __LINE__); \
45 int dlqEmpty(dlqlinkP headptr )
47 DLQ_ASSERT_HEAD(headptr);
48 if (headptr->dlq_next == headptr)
53 int dlqInit(dlqlinkP headptr)
55 headptr->dlq_next = headptr;
56 headptr->dlq_prev = headptr;
57 headptr->dlq_type = DLQ_HEAD;
58 headptr->dlq_structPtr = NULL;
63 * link item to front of chain
65 int dlqLinkf(dlqlinkP headptr, dlqlinkP entryptr)
67 DLQ_ASSERT_HEAD(headptr);
68 /* link in as first item in chain */
69 entryptr->dlq_next = headptr->dlq_next;
70 headptr->dlq_next->dlq_prev = entryptr;
71 entryptr->dlq_prev = headptr;
72 headptr->dlq_next = entryptr;
77 * link item to end of chain
80 int dlqLinkb(dlqlinkP headptr, dlqlinkP entryptr)
82 DLQ_ASSERT_HEAD(headptr);
83 entryptr->dlq_next = headptr;
84 entryptr->dlq_prev = headptr->dlq_prev;
86 headptr->dlq_prev = entryptr;
87 entryptr->dlq_prev->dlq_next = entryptr;
92 * move all the items on the fromptr and append to the toptr's list
95 void dlqMoveb( dlqlinkP fromptr, dlqlinkP toptr)
99 DLQ_ASSERT_HEAD(fromptr);
100 DLQ_ASSERT_HEAD(toptr);
102 if (dlqEmpty(fromptr))
105 tailptr = toptr->dlq_prev;
107 tailptr->dlq_next = fromptr->dlq_next;
108 tailptr->dlq_next->dlq_prev = tailptr;
110 /* now fix up the last item in the new chain */
111 tailptr = fromptr->dlq_prev;
113 tailptr->dlq_next = toptr;
114 toptr->dlq_prev = tailptr;
116 fromptr->dlq_next = fromptr;
117 fromptr->dlq_prev = fromptr;
122 * unlink the last item on the queue
125 dlqlinkP dlqUnlinkb(dlqlinkP headptr)
128 DLQ_ASSERT_HEAD(headptr);
130 if (dlqEmpty(headptr))
133 ptr = headptr->dlq_prev;
134 ptr->dlq_prev->dlq_next = headptr;
135 headptr->dlq_prev = ptr->dlq_prev;
143 * unlink the item on the front of the queue
146 dlqlinkP dlqUnlinkf(dlqlinkP headptr)
149 DLQ_ASSERT_HEAD(headptr);
151 if (dlqEmpty(headptr))
154 ptr = headptr->dlq_next;
156 headptr->dlq_next = ptr->dlq_next;
157 ptr->dlq_next->dlq_prev = headptr;
165 * unlink the specified item from the queue.
168 void dlqUnlink( dlqlinkP ptr)
170 /* must not be the queue head */
171 if (ptr->dlq_type == DLQ_HEAD) {
172 printf("dlqUnlink: invalid unlink\n");
176 ptr->dlq_prev->dlq_next = ptr->dlq_next;
177 ptr->dlq_next->dlq_prev = ptr->dlq_prev;
184 * return point to item at front of queuen
187 dlqlinkP dlqFront(dlqlinkP headptr)
189 DLQ_ASSERT_HEAD(headptr);
191 if (dlqEmpty(headptr))
194 return (headptr->dlq_next);
197 int dlqCount(dlqlinkP headptr)
202 DLQ_ASSERT_HEAD(headptr);
204 ptr = headptr->dlq_next;
205 while (ptr != headptr) {
212 int dlqTraverseQueue(dlqlinkP headptr, int (*fn1)(void *), int (*fn2)(void *))
214 dlqlinkP ptr, oldPtr;
216 DLQ_ASSERT_HEAD(headptr);
218 ptr = headptr->dlq_next;
219 while (ptr != headptr) {
220 if (fn2 && ptr->dlq_structPtr)
221 (*fn2) (ptr->dlq_structPtr);