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>
17 #include <afs/bubasics.h>
18 #include "bucoord_prototypes.h"
21 int dlqCount(dlqlinkP );
22 void dlqMoveb( dlqlinkP, dlqlinkP);
23 dlqlinkP dlqUnlinkb(dlqlinkP );
24 dlqlinkP dlqUnlinkf(dlqlinkP );
25 dlqlinkP dlqFront(dlqlinkP headptr);
27 #define DLQ_ASSERT_HEAD(headptr) \
28 if ( (headptr)->dlq_type != DLQ_HEAD ) \
30 printf("file %s line %d, invalid queue head\n", \
31 __FILE__, __LINE__); \
42 int dlqEmpty(dlqlinkP headptr )
44 DLQ_ASSERT_HEAD(headptr);
45 if (headptr->dlq_next == headptr)
50 int dlqInit(dlqlinkP headptr)
52 headptr->dlq_next = headptr;
53 headptr->dlq_prev = headptr;
54 headptr->dlq_type = DLQ_HEAD;
55 headptr->dlq_structPtr = NULL;
60 * link item to front of chain
62 int dlqLinkf(dlqlinkP headptr, dlqlinkP entryptr)
64 DLQ_ASSERT_HEAD(headptr);
65 /* link in as first item in chain */
66 entryptr->dlq_next = headptr->dlq_next;
67 headptr->dlq_next->dlq_prev = entryptr;
68 entryptr->dlq_prev = headptr;
69 headptr->dlq_next = entryptr;
74 * link item to end of chain
77 int dlqLinkb(dlqlinkP headptr, dlqlinkP entryptr)
79 DLQ_ASSERT_HEAD(headptr);
80 entryptr->dlq_next = headptr;
81 entryptr->dlq_prev = headptr->dlq_prev;
83 headptr->dlq_prev = entryptr;
84 entryptr->dlq_prev->dlq_next = entryptr;
89 * move all the items on the fromptr and append to the toptr's list
92 void dlqMoveb( dlqlinkP fromptr, dlqlinkP toptr)
96 DLQ_ASSERT_HEAD(fromptr);
97 DLQ_ASSERT_HEAD(toptr);
99 if (dlqEmpty(fromptr))
102 tailptr = toptr->dlq_prev;
104 tailptr->dlq_next = fromptr->dlq_next;
105 tailptr->dlq_next->dlq_prev = tailptr;
107 /* now fix up the last item in the new chain */
108 tailptr = fromptr->dlq_prev;
110 tailptr->dlq_next = toptr;
111 toptr->dlq_prev = tailptr;
113 fromptr->dlq_next = fromptr;
114 fromptr->dlq_prev = fromptr;
119 * unlink the last item on the queue
122 dlqlinkP dlqUnlinkb(dlqlinkP headptr)
125 DLQ_ASSERT_HEAD(headptr);
127 if (dlqEmpty(headptr))
130 ptr = headptr->dlq_prev;
131 ptr->dlq_prev->dlq_next = headptr;
132 headptr->dlq_prev = ptr->dlq_prev;
140 * unlink the item on the front of the queue
143 dlqlinkP dlqUnlinkf(dlqlinkP headptr)
146 DLQ_ASSERT_HEAD(headptr);
148 if (dlqEmpty(headptr))
151 ptr = headptr->dlq_next;
153 headptr->dlq_next = ptr->dlq_next;
154 ptr->dlq_next->dlq_prev = headptr;
162 * unlink the specified item from the queue.
165 void dlqUnlink( dlqlinkP ptr)
167 /* must not be the queue head */
168 if (ptr->dlq_type == DLQ_HEAD) {
169 printf("dlqUnlink: invalid unlink\n");
173 ptr->dlq_prev->dlq_next = ptr->dlq_next;
174 ptr->dlq_next->dlq_prev = ptr->dlq_prev;
181 * return point to item at front of queuen
184 dlqlinkP dlqFront(dlqlinkP headptr)
186 DLQ_ASSERT_HEAD(headptr);
188 if (dlqEmpty(headptr))
191 return (headptr->dlq_next);
194 int dlqCount(dlqlinkP headptr)
199 DLQ_ASSERT_HEAD(headptr);
201 ptr = headptr->dlq_next;
202 while (ptr != headptr) {
209 int dlqTraverseQueue(dlqlinkP headptr, int (*fn1)(void *), int (*fn2)(void *))
211 dlqlinkP ptr, oldPtr;
213 DLQ_ASSERT_HEAD(headptr);
215 ptr = headptr->dlq_next;
216 while (ptr != headptr) {
217 if (fn2 && ptr->dlq_structPtr)
218 (*fn2) (ptr->dlq_structPtr);