queue.h

来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 507 行 · 第 1/2 页

H
507
字号
} while (/*CONSTCOND*/0)#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\	if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(head)->sqh_first = (elm);					\} while (/*CONSTCOND*/0)#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.sqe_next = NULL;					\	*(head)->sqh_last = (elm);					\	(head)->sqh_last = &(elm)->field.sqe_next;			\} while (/*CONSTCOND*/0)#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(listelm)->field.sqe_next = (elm);				\} while (/*CONSTCOND*/0)#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {			\	if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)	\		(head)->sqh_last = &(head)->sqh_first;			\} while (/*CONSTCOND*/0)#define SIMPLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->sqh_first);				\		(var);							\		(var) = ((var)->field.sqe_next))/* * Simple queue access methods. */#define	SIMPLEQ_EMPTY(head)		((head)->sqh_first == NULL)#define	SIMPLEQ_FIRST(head)		((head)->sqh_first)#define	SIMPLEQ_NEXT(elm, field)	((elm)->field.sqe_next)/* * Tail queue definitions. */#define TAILQ_HEAD(name, type)						\struct name {								\	struct type *tqh_first;	/* first element */			\	struct type **tqh_last;	/* addr of last next element */		\}#define TAILQ_HEAD_INITIALIZER(head)					\	{ NULL, &(head).tqh_first }#define TAILQ_ENTRY(type)						\struct {								\	struct type *tqe_next;	/* next element */			\	struct type **tqe_prev;	/* address of previous next element */	\}/* * Tail queue functions. */#if defined(_KERNEL) && defined(QUEUEDEBUG)#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)			\	if ((head)->tqh_first &&					\	    (head)->tqh_first->field.tqe_prev != &(head)->tqh_first)	\		panic("TAILQ_INSERT_HEAD %p", (head));#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)			\	if (*(head)->tqh_last != NULL)					\		panic("TAILQ_INSERT_TAIL %p", (head));#define QUEUEDEBUG_TAILQ_OP(elm, field)					\	if ((elm)->field.tqe_next &&					\	    (elm)->field.tqe_next->field.tqe_prev !=			\	    &(elm)->field.tqe_next)					\		panic("TAILQ_* forw %p", elm);				\	if (*(elm)->field.tqe_prev != (elm))				\		panic("TAILQ_* back %p", elm);#else#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)#define QUEUEDEBUG_TAILQ_OP(elm, field)#endif#define	TAILQ_INIT(head) do {						\	(head)->tqh_first = NULL;					\	(head)->tqh_last = &(head)->tqh_first;				\} while (/*CONSTCOND*/0)#define TAILQ_INSERT_HEAD(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)			\	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\		(head)->tqh_first->field.tqe_prev =			\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(head)->tqh_first = (elm);					\	(elm)->field.tqe_prev = &(head)->tqh_first;			\} while (/*CONSTCOND*/0)#define TAILQ_INSERT_TAIL(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)			\	(elm)->field.tqe_next = NULL;					\	(elm)->field.tqe_prev = (head)->tqh_last;			\	*(head)->tqh_last = (elm);					\	(head)->tqh_last = &(elm)->field.tqe_next;			\} while (/*CONSTCOND*/0)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\	QUEUEDEBUG_TAILQ_OP(listelm, field)				\	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\		(elm)->field.tqe_next->field.tqe_prev = 		\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(listelm)->field.tqe_next = (elm);				\	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\} while (/*CONSTCOND*/0)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\	QUEUEDEBUG_TAILQ_OP(listelm, field)				\	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\	(elm)->field.tqe_next = (listelm);				\	*(listelm)->field.tqe_prev = (elm);				\	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\} while (/*CONSTCOND*/0)#define TAILQ_REMOVE(head, elm, field) do {				\	QUEUEDEBUG_TAILQ_OP(elm, field)					\	if (((elm)->field.tqe_next) != NULL)				\		(elm)->field.tqe_next->field.tqe_prev = 		\		    (elm)->field.tqe_prev;				\	else								\		(head)->tqh_last = (elm)->field.tqe_prev;		\	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\} while (/*CONSTCOND*/0)/* * Tail queue access methods. */#define	TAILQ_EMPTY(head)		((head)->tqh_first == NULL)#define	TAILQ_FIRST(head)		((head)->tqh_first)#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)#define TAILQ_LAST(head, headname) \	(*(((struct headname *)((head)->tqh_last))->tqh_last))#define TAILQ_PREV(elm, headname, field) \	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))#define TAILQ_FOREACH(var, head, field)					\	for ((var) = ((head)->tqh_first);				\		(var);							\		(var) = ((var)->field.tqe_next))#define TAILQ_FOREACH_REVERSE(var, head, headname, field)		\	for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));	\		(var);							\		(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))/* * Circular queue definitions. */#define CIRCLEQ_HEAD(name, type)					\struct name {								\	struct type *cqh_first;		/* first element */		\	struct type *cqh_last;		/* last element */		\}#define CIRCLEQ_HEAD_INITIALIZER(head)					\	{ (void *)&head, (void *)&head }#define CIRCLEQ_ENTRY(type)						\struct {								\	struct type *cqe_next;		/* next element */		\	struct type *cqe_prev;		/* previous element */		\}/* * Circular queue functions. */#define	CIRCLEQ_INIT(head) do {						\	(head)->cqh_first = (void *)(head);				\	(head)->cqh_last = (void *)(head);				\} while (/*CONSTCOND*/0)#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\	(elm)->field.cqe_prev = (listelm);				\	if ((listelm)->field.cqe_next == (void *)(head))		\		(head)->cqh_last = (elm);				\	else								\		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\	(listelm)->field.cqe_next = (elm);				\} while (/*CONSTCOND*/0)#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm);				\	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\	if ((listelm)->field.cqe_prev == (void *)(head))		\		(head)->cqh_first = (elm);				\	else								\		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\	(listelm)->field.cqe_prev = (elm);				\} while (/*CONSTCOND*/0)#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\	(elm)->field.cqe_next = (head)->cqh_first;			\	(elm)->field.cqe_prev = (void *)(head);				\	if ((head)->cqh_last == (void *)(head))				\		(head)->cqh_last = (elm);				\	else								\		(head)->cqh_first->field.cqe_prev = (elm);		\	(head)->cqh_first = (elm);					\} while (/*CONSTCOND*/0)#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.cqe_next = (void *)(head);				\	(elm)->field.cqe_prev = (head)->cqh_last;			\	if ((head)->cqh_first == (void *)(head))			\		(head)->cqh_first = (elm);				\	else								\		(head)->cqh_last->field.cqe_next = (elm);		\	(head)->cqh_last = (elm);					\} while (/*CONSTCOND*/0)#define	CIRCLEQ_REMOVE(head, elm, field) do {				\	if ((elm)->field.cqe_next == (void *)(head))			\		(head)->cqh_last = (elm)->field.cqe_prev;		\	else								\		(elm)->field.cqe_next->field.cqe_prev =			\		    (elm)->field.cqe_prev;				\	if ((elm)->field.cqe_prev == (void *)(head))			\		(head)->cqh_first = (elm)->field.cqe_next;		\	else								\		(elm)->field.cqe_prev->field.cqe_next =			\		    (elm)->field.cqe_next;				\} while (/*CONSTCOND*/0)#define CIRCLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->cqh_first);				\		(var) != (void *)(head);				\		(var) = ((var)->field.cqe_next))#define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\	for ((var) = ((head)->cqh_last);				\		(var) != (void *)(head);				\		(var) = ((var)->field.cqe_prev))/* * Circular queue access methods. */#define	CIRCLEQ_EMPTY(head)		((head)->cqh_first == (void *)(head))#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)#define	CIRCLEQ_LAST(head)		((head)->cqh_last)#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)#endif	/* !_SYS_QUEUE_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?