queue.h
上传用户:jnmzc84
上传日期:2022-08-08
资源大小:35k
文件大小:17k
源码类别:

网络编程

开发平台:

Visual C++

  1. /* $OpenBSD: queue.h,v 1.16 2000/09/07 19:47:59 art Exp $ */
  2. /* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */
  3. /*
  4.  * Copyright (c) 1991, 1993
  5.  * The Regents of the University of California.  All rights reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. Neither the name of the University nor the names of its contributors
  16.  *    may be used to endorse or promote products derived from this software
  17.  *    without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29.  * SUCH DAMAGE.
  30.  *
  31.  * @(#)queue.h 8.5 (Berkeley) 8/20/94
  32.  */
  33. #ifndef _SYS_QUEUE_H_
  34. #define _SYS_QUEUE_H_
  35. /*
  36.  * This file defines five types of data structures: singly-linked lists, 
  37.  * lists, simple queues, tail queues, and circular queues.
  38.  *
  39.  *
  40.  * A singly-linked list is headed by a single forward pointer. The elements
  41.  * are singly linked for minimum space and pointer manipulation overhead at
  42.  * the expense of O(n) removal for arbitrary elements. New elements can be
  43.  * added to the list after an existing element or at the head of the list.
  44.  * Elements being removed from the head of the list should use the explicit
  45.  * macro for this purpose for optimum efficiency. A singly-linked list may
  46.  * only be traversed in the forward direction.  Singly-linked lists are ideal
  47.  * for applications with large datasets and few or no removals or for
  48.  * implementing a LIFO queue.
  49.  *
  50.  * A list is headed by a single forward pointer (or an array of forward
  51.  * pointers for a hash table header). The elements are doubly linked
  52.  * so that an arbitrary element can be removed without a need to
  53.  * traverse the list. New elements can be added to the list before
  54.  * or after an existing element or at the head of the list. A list
  55.  * may only be traversed in the forward direction.
  56.  *
  57.  * A simple queue is headed by a pair of pointers, one the head of the
  58.  * list and the other to the tail of the list. The elements are singly
  59.  * linked to save space, so elements can only be removed from the
  60.  * head of the list. New elements can be added to the list before or after
  61.  * an existing element, at the head of the list, or at the end of the
  62.  * list. A simple queue may only be traversed in the forward direction.
  63.  *
  64.  * A tail queue is headed by a pair of pointers, one to the head of the
  65.  * list and the other to the tail of the list. The elements are doubly
  66.  * linked so that an arbitrary element can be removed without a need to
  67.  * traverse the list. New elements can be added to the list before or
  68.  * after an existing element, at the head of the list, or at the end of
  69.  * the list. A tail queue may be traversed in either direction.
  70.  *
  71.  * A circle queue is headed by a pair of pointers, one to the head of the
  72.  * list and the other to the tail of the list. The elements are doubly
  73.  * linked so that an arbitrary element can be removed without a need to
  74.  * traverse the list. New elements can be added to the list before or after
  75.  * an existing element, at the head of the list, or at the end of the list.
  76.  * A circle queue may be traversed in either direction, but has a more
  77.  * complex end of list detection.
  78.  *
  79.  * For details on the use of these macros, see the queue(3) manual page.
  80.  */
  81. /*
  82.  * Singly-linked List definitions.
  83.  */
  84. #define SLIST_HEAD(name, type)
  85. struct name {
  86. struct type *slh_first; /* first element */
  87. }
  88.  
  89. #define SLIST_HEAD_INITIALIZER(head)
  90. { NULL }
  91. /* modified by Kevin Lynx */
  92. #ifdef WIN32
  93. #undef SLIST_ENTRY
  94. #endif
  95. #define SLIST_ENTRY(type)
  96. struct {
  97. struct type *sle_next; /* next element */
  98. }
  99. /*
  100.  * Singly-linked List access methods.
  101.  */
  102. #define SLIST_FIRST(head) ((head)->slh_first)
  103. #define SLIST_END(head) NULL
  104. #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
  105. #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
  106. #define SLIST_FOREACH(var, head, field)
  107. for((var) = SLIST_FIRST(head);
  108.     (var) != SLIST_END(head);
  109.     (var) = SLIST_NEXT(var, field))
  110. /*
  111.  * Singly-linked List functions.
  112.  */
  113. #define SLIST_INIT(head) {
  114. SLIST_FIRST(head) = SLIST_END(head);
  115. }
  116. #define SLIST_INSERT_AFTER(slistelm, elm, field) do {
  117. (elm)->field.sle_next = (slistelm)->field.sle_next;
  118. (slistelm)->field.sle_next = (elm);
  119. } while (0)
  120. #define SLIST_INSERT_HEAD(head, elm, field) do {
  121. (elm)->field.sle_next = (head)->slh_first;
  122. (head)->slh_first = (elm);
  123. } while (0)
  124. #define SLIST_REMOVE_HEAD(head, field) do {
  125. (head)->slh_first = (head)->slh_first->field.sle_next;
  126. } while (0)
  127. /*
  128.  * List definitions.
  129.  */
  130. #define LIST_HEAD(name, type)
  131. struct name {
  132. struct type *lh_first; /* first element */
  133. }
  134. #define LIST_HEAD_INITIALIZER(head)
  135. { NULL }
  136. #define LIST_ENTRY(type)
  137. struct {
  138. struct type *le_next; /* next element */
  139. struct type **le_prev; /* address of previous next element */
  140. }
  141. /*
  142.  * List access methods
  143.  */
  144. #define LIST_FIRST(head) ((head)->lh_first)
  145. #define LIST_END(head) NULL
  146. #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
  147. #define LIST_NEXT(elm, field) ((elm)->field.le_next)
  148. #define LIST_FOREACH(var, head, field)
  149. for((var) = LIST_FIRST(head);
  150.     (var)!= LIST_END(head);
  151.     (var) = LIST_NEXT(var, field))
  152. /*
  153.  * List functions.
  154.  */
  155. #define LIST_INIT(head) do {
  156. LIST_FIRST(head) = LIST_END(head);
  157. } while (0)
  158. #define LIST_INSERT_AFTER(listelm, elm, field) do {
  159. if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)
  160. (listelm)->field.le_next->field.le_prev =
  161.     &(elm)->field.le_next;
  162. (listelm)->field.le_next = (elm);
  163. (elm)->field.le_prev = &(listelm)->field.le_next;
  164. } while (0)
  165. #define LIST_INSERT_BEFORE(listelm, elm, field) do {
  166. (elm)->field.le_prev = (listelm)->field.le_prev;
  167. (elm)->field.le_next = (listelm);
  168. *(listelm)->field.le_prev = (elm);
  169. (listelm)->field.le_prev = &(elm)->field.le_next;
  170. } while (0)
  171. #define LIST_INSERT_HEAD(head, elm, field) do {
  172. if (((elm)->field.le_next = (head)->lh_first) != NULL)
  173. (head)->lh_first->field.le_prev = &(elm)->field.le_next;
  174. (head)->lh_first = (elm);
  175. (elm)->field.le_prev = &(head)->lh_first;
  176. } while (0)
  177. #define LIST_REMOVE(elm, field) do {
  178. if ((elm)->field.le_next != NULL)
  179. (elm)->field.le_next->field.le_prev =
  180.     (elm)->field.le_prev;
  181. *(elm)->field.le_prev = (elm)->field.le_next;
  182. } while (0)
  183. #define LIST_REPLACE(elm, elm2, field) do {
  184. if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)
  185. (elm2)->field.le_next->field.le_prev =
  186.     &(elm2)->field.le_next;
  187. (elm2)->field.le_prev = (elm)->field.le_prev;
  188. *(elm2)->field.le_prev = (elm2);
  189. } while (0)
  190. /*
  191.  * Simple queue definitions.
  192.  */
  193. #define SIMPLEQ_HEAD(name, type)
  194. struct name {
  195. struct type *sqh_first; /* first element */
  196. struct type **sqh_last; /* addr of last next element */
  197. }
  198. #define SIMPLEQ_HEAD_INITIALIZER(head)
  199. { NULL, &(head).sqh_first }
  200. #define SIMPLEQ_ENTRY(type)
  201. struct {
  202. struct type *sqe_next; /* next element */
  203. }
  204. /*
  205.  * Simple queue access methods.
  206.  */
  207. #define SIMPLEQ_FIRST(head)     ((head)->sqh_first)
  208. #define SIMPLEQ_END(head)     NULL
  209. #define SIMPLEQ_EMPTY(head)     (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
  210. #define SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
  211. #define SIMPLEQ_FOREACH(var, head, field)
  212. for((var) = SIMPLEQ_FIRST(head);
  213.     (var) != SIMPLEQ_END(head);
  214.     (var) = SIMPLEQ_NEXT(var, field))
  215. /*
  216.  * Simple queue functions.
  217.  */
  218. #define SIMPLEQ_INIT(head) do {
  219. (head)->sqh_first = NULL;
  220. (head)->sqh_last = &(head)->sqh_first;
  221. } while (0)
  222. #define SIMPLEQ_INSERT_HEAD(head, elm, field) do {
  223. if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)
  224. (head)->sqh_last = &(elm)->field.sqe_next;
  225. (head)->sqh_first = (elm);
  226. } while (0)
  227. #define SIMPLEQ_INSERT_TAIL(head, elm, field) do {
  228. (elm)->field.sqe_next = NULL;
  229. *(head)->sqh_last = (elm);
  230. (head)->sqh_last = &(elm)->field.sqe_next;
  231. } while (0)
  232. #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {
  233. if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)
  234. (head)->sqh_last = &(elm)->field.sqe_next;
  235. (listelm)->field.sqe_next = (elm);
  236. } while (0)
  237. #define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {
  238. if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)
  239. (head)->sqh_last = &(head)->sqh_first;
  240. } while (0)
  241. /*
  242.  * Tail queue definitions.
  243.  */
  244. #define TAILQ_HEAD(name, type)
  245. struct name {
  246. struct type *tqh_first; /* first element */
  247. struct type **tqh_last; /* addr of last next element */
  248. }
  249. #define TAILQ_HEAD_INITIALIZER(head)
  250. { NULL, &(head).tqh_first }
  251. #define TAILQ_ENTRY(type)
  252. struct {
  253. struct type *tqe_next; /* next element */
  254. struct type **tqe_prev; /* address of previous next element */
  255. }
  256. /* 
  257.  * tail queue access methods 
  258.  */
  259. #define TAILQ_FIRST(head) ((head)->tqh_first)
  260. #define TAILQ_END(head) NULL
  261. #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
  262. #define TAILQ_LAST(head, headname)
  263. (*(((struct headname *)((head)->tqh_last))->tqh_last))
  264. /* XXX */
  265. #define TAILQ_PREV(elm, headname, field)
  266. (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
  267. #define TAILQ_EMPTY(head)
  268. (TAILQ_FIRST(head) == TAILQ_END(head))
  269. #define TAILQ_FOREACH(var, head, field)
  270. for((var) = TAILQ_FIRST(head);
  271.     (var) != TAILQ_END(head);
  272.     (var) = TAILQ_NEXT(var, field))
  273. #define TAILQ_FOREACH_REVERSE(var, head, field, headname)
  274. for((var) = TAILQ_LAST(head, headname);
  275.     (var) != TAILQ_END(head);
  276.     (var) = TAILQ_PREV(var, headname, field))
  277. /*
  278.  * Tail queue functions.
  279.  */
  280. #define TAILQ_INIT(head) do {
  281. (head)->tqh_first = NULL;
  282. (head)->tqh_last = &(head)->tqh_first;
  283. } while (0)
  284. #define TAILQ_INSERT_HEAD(head, elm, field) do {
  285. if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)
  286. (head)->tqh_first->field.tqe_prev =
  287.     &(elm)->field.tqe_next;
  288. else
  289. (head)->tqh_last = &(elm)->field.tqe_next;
  290. (head)->tqh_first = (elm);
  291. (elm)->field.tqe_prev = &(head)->tqh_first;
  292. } while (0)
  293. #define TAILQ_INSERT_TAIL(head, elm, field) do {
  294. (elm)->field.tqe_next = NULL;
  295. (elm)->field.tqe_prev = (head)->tqh_last;
  296. *(head)->tqh_last = (elm);
  297. (head)->tqh_last = &(elm)->field.tqe_next;
  298. } while (0)
  299. #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {
  300. if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)
  301. (elm)->field.tqe_next->field.tqe_prev =
  302.     &(elm)->field.tqe_next;
  303. else
  304. (head)->tqh_last = &(elm)->field.tqe_next;
  305. (listelm)->field.tqe_next = (elm);
  306. (elm)->field.tqe_prev = &(listelm)->field.tqe_next;
  307. } while (0)
  308. #define TAILQ_INSERT_BEFORE(listelm, elm, field) do {
  309. (elm)->field.tqe_prev = (listelm)->field.tqe_prev;
  310. (elm)->field.tqe_next = (listelm);
  311. *(listelm)->field.tqe_prev = (elm);
  312. (listelm)->field.tqe_prev = &(elm)->field.tqe_next;
  313. } while (0)
  314. #define TAILQ_REMOVE(head, elm, field) do {
  315. if (((elm)->field.tqe_next) != NULL)
  316. (elm)->field.tqe_next->field.tqe_prev =
  317.     (elm)->field.tqe_prev;
  318. else
  319. (head)->tqh_last = (elm)->field.tqe_prev;
  320. *(elm)->field.tqe_prev = (elm)->field.tqe_next;
  321. } while (0)
  322. #define TAILQ_REPLACE(head, elm, elm2, field) do {
  323. if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)
  324. (elm2)->field.tqe_next->field.tqe_prev =
  325.     &(elm2)->field.tqe_next;
  326. else
  327. (head)->tqh_last = &(elm2)->field.tqe_next;
  328. (elm2)->field.tqe_prev = (elm)->field.tqe_prev;
  329. *(elm2)->field.tqe_prev = (elm2);
  330. } while (0)
  331. /*
  332.  * Circular queue definitions.
  333.  */
  334. #define CIRCLEQ_HEAD(name, type)
  335. struct name {
  336. struct type *cqh_first; /* first element */
  337. struct type *cqh_last; /* last element */
  338. }
  339. #define CIRCLEQ_HEAD_INITIALIZER(head)
  340. { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
  341. #define CIRCLEQ_ENTRY(type)
  342. struct {
  343. struct type *cqe_next; /* next element */
  344. struct type *cqe_prev; /* previous element */
  345. }
  346. /*
  347.  * Circular queue access methods 
  348.  */
  349. #define CIRCLEQ_FIRST(head) ((head)->cqh_first)
  350. #define CIRCLEQ_LAST(head) ((head)->cqh_last)
  351. #define CIRCLEQ_END(head) ((void *)(head))
  352. #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
  353. #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
  354. #define CIRCLEQ_EMPTY(head)
  355. (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
  356. #define CIRCLEQ_FOREACH(var, head, field)
  357. for((var) = CIRCLEQ_FIRST(head);
  358.     (var) != CIRCLEQ_END(head);
  359.     (var) = CIRCLEQ_NEXT(var, field))
  360. #define CIRCLEQ_FOREACH_REVERSE(var, head, field)
  361. for((var) = CIRCLEQ_LAST(head);
  362.     (var) != CIRCLEQ_END(head);
  363.     (var) = CIRCLEQ_PREV(var, field))
  364. /*
  365.  * Circular queue functions.
  366.  */
  367. #define CIRCLEQ_INIT(head) do {
  368. (head)->cqh_first = CIRCLEQ_END(head);
  369. (head)->cqh_last = CIRCLEQ_END(head);
  370. } while (0)
  371. #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {
  372. (elm)->field.cqe_next = (listelm)->field.cqe_next;
  373. (elm)->field.cqe_prev = (listelm);
  374. if ((listelm)->field.cqe_next == CIRCLEQ_END(head))
  375. (head)->cqh_last = (elm);
  376. else
  377. (listelm)->field.cqe_next->field.cqe_prev = (elm);
  378. (listelm)->field.cqe_next = (elm);
  379. } while (0)
  380. #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {
  381. (elm)->field.cqe_next = (listelm);
  382. (elm)->field.cqe_prev = (listelm)->field.cqe_prev;
  383. if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))
  384. (head)->cqh_first = (elm);
  385. else
  386. (listelm)->field.cqe_prev->field.cqe_next = (elm);
  387. (listelm)->field.cqe_prev = (elm);
  388. } while (0)
  389. #define CIRCLEQ_INSERT_HEAD(head, elm, field) do {
  390. (elm)->field.cqe_next = (head)->cqh_first;
  391. (elm)->field.cqe_prev = CIRCLEQ_END(head);
  392. if ((head)->cqh_last == CIRCLEQ_END(head))
  393. (head)->cqh_last = (elm);
  394. else
  395. (head)->cqh_first->field.cqe_prev = (elm);
  396. (head)->cqh_first = (elm);
  397. } while (0)
  398. #define CIRCLEQ_INSERT_TAIL(head, elm, field) do {
  399. (elm)->field.cqe_next = CIRCLEQ_END(head);
  400. (elm)->field.cqe_prev = (head)->cqh_last;
  401. if ((head)->cqh_first == CIRCLEQ_END(head))
  402. (head)->cqh_first = (elm);
  403. else
  404. (head)->cqh_last->field.cqe_next = (elm);
  405. (head)->cqh_last = (elm);
  406. } while (0)
  407. #define CIRCLEQ_REMOVE(head, elm, field) do {
  408. if ((elm)->field.cqe_next == CIRCLEQ_END(head))
  409. (head)->cqh_last = (elm)->field.cqe_prev;
  410. else
  411. (elm)->field.cqe_next->field.cqe_prev =
  412.     (elm)->field.cqe_prev;
  413. if ((elm)->field.cqe_prev == CIRCLEQ_END(head))
  414. (head)->cqh_first = (elm)->field.cqe_next;
  415. else
  416. (elm)->field.cqe_prev->field.cqe_next =
  417.     (elm)->field.cqe_next;
  418. } while (0)
  419. #define CIRCLEQ_REPLACE(head, elm, elm2, field) do {
  420. if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==
  421.     CIRCLEQ_END(head))
  422. (head).cqh_last = (elm2);
  423. else
  424. (elm2)->field.cqe_next->field.cqe_prev = (elm2);
  425. if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==
  426.     CIRCLEQ_END(head))
  427. (head).cqh_first = (elm2);
  428. else
  429. (elm2)->field.cqe_prev->field.cqe_next = (elm2);
  430. } while (0)
  431. #endif /* !_SYS_QUEUE_H_ */