IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    DNS编程开发(5)—LIST数据结构

    cjhust发表于 2014-12-26 19:23:10
    love 0

    1、操作函数

    #vi lib/isc/include/isc/list.h

    1.1 ISC_LIST_INIT

    #define ISC_LIST_INIT(list) \

    do { (list).head = NULL; (list).tail = NULL; } while (0)

    函数功能:初始化list的head和tail为NULL。

    具体调用:ISC_LIST_INIT(sock->accept_list)。

    1.2 ISC_LIST_HEAD

    #define ISC_LIST_HEAD(list) ((list).head)

    函数功能:取list的head。

    具体调用:ISC_LIST_HEAD(sock->accept_list);

    1.3 ISC_LIST_TAIL

    #define ISC_LIST_TAIL(list) ((list).tail)

    函数功能:取list的tail。

    1.4 ISC_LIST_EMPTY

    #define ISC_LIST_EMPTY(list) ISC_TF((list).head == NULL)

    函数功能:判断list是否为空。

    1.5 ISC_LIST和ISC_LINK

    #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是一样的功能。

    1.6 ISC_LIST_ENQUEUE(添加新节点)

    #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);

    ISC_LIST_APPEND

    #define ISC_LIST_APPEND(list, elt, link) \

    do { \

    ISC_LINK_INSIST(!ISC_LINK_LINKED(elt, link)); \

    __ISC_LIST_APPENDUNSAFE(list, elt, link); \

    } while (0)

    __ISC_LIST_APPENDUNSAFE

    #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。

    clip_image002

    1.7 ISC_LIST_DEQUEUE和ISC_LIST_UNLINK(删除节点)

    #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。

    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)

    __ISC_LIST_UNLINKUNSAFE_TYPE

    #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)

    clip_image002[4]

    clip_image002[10]

    clip_image002[12]

    具体调用:

    isc_socket_newconnev_t *dev;

    ISC_LIST_UNLINK(sock->accept_list, dev, ev_link)。



沪ICP备19023445号-2号
友情链接