#vi lib/isc/include/isc/list.h
#define ISC_LIST_INIT(list) \
do { (list).head = NULL; (list).tail = NULL; } while (0)
函数功能:初始化list的head和tail为NULL。
具体调用:ISC_LIST_INIT(sock->accept_list)。
#define ISC_LIST_HEAD(list) ((list).head)
函数功能:取list的head。
具体调用:ISC_LIST_HEAD(sock->accept_list);
#define ISC_LIST_TAIL(list) ((list).tail)
函数功能:取list的tail。
#define ISC_LIST_EMPTY(list) ISC_TF((list).head == NULL)
函数功能:判断list是否为空。
#define ISC_LIST(type) struct { type *prev, *next; }
函数功能:即声明一个struct,内容是type的prev和next。
struct{
LIST(isc__task_t) link;
};
等价于
struct{
struct{
isc_task_t *prev;
isc_task_t *next;
} link;
};
备注:ISC_LINK和ISC_LIST是一样的功能。
#define ISC_LIST_ENQUEUE(list, elt, link) ISC_LIST_APPEND(list, elt, link)
函数功能:添加新的元素到list中。
具体调用:
isc_socket_newconnev_t *dev;
ISC_LIST_ENQUEUE(sock->accept_list, dev, ev_link);
#define ISC_LIST_APPEND(list, elt, link) \
do { \
ISC_LINK_INSIST(!ISC_LINK_LINKED(elt, link)); \
__ISC_LIST_APPENDUNSAFE(list, elt, link); \
} while (0)
#define __ISC_LIST_APPENDUNSAFE(list, elt, link) \
do { \
if ((list).tail != NULL) \
(list).tail->link.next = (elt); \
else \
(list).head = (elt); \
(elt)->link.prev = (list).tail; \
(elt)->link.next = NULL; \
(list).tail = (elt); \
} while (0)
函数功能:list.head->elt1->elt2->elt3(list.tail)->NULL。
#define ISC_LIST_DEQUEUE(list, elt, link) \
ISC_LIST_UNLINK_TYPE(list, elt, link, void)
#define ISC_LIST_UNLINK(list, elt, link) \
ISC_LIST_UNLINK_TYPE(list, elt, link, void)
函数功能:调用ISC_LIST_UNLINK_TYPE。
#define ISC_LIST_UNLINK_TYPE(list, elt, link, type) \
do { \
ISC_LINK_INSIST(ISC_LINK_LINKED(elt, link)); \
__ISC_LIST_UNLINKUNSAFE_TYPE(list, elt, link, type); \
} while (0)
#define __ISC_LIST_UNLINKUNSAFE_TYPE(list, elt, link, type) \
do { \
if ((elt)->link.next != NULL) \
(elt)->link.next->link.prev = (elt)->link.prev; \
else { \ //最后一个节点
ISC_INSIST((list).tail == (elt)); \
(list).tail = (elt)->link.prev; \
} \
if ((elt)->link.prev != NULL) \
(elt)->link.prev->link.next = (elt)->link.next; \
else { \
ISC_INSIST((list).head == (elt)); \
(list).head = (elt)->link.next; \
} \
(elt)->link.prev = (type *)(-1); \
(elt)->link.next = (type *)(-1); \
ISC_INSIST((list).head != (elt)); \
ISC_INSIST((list).tail != (elt)); \
} while (0)
具体调用:
isc_socket_newconnev_t *dev;
ISC_LIST_UNLINK(sock->accept_list, dev, ev_link)。