src/core/ngx_queue.h - nginx-1.7.10

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. #ifndef _NGX_QUEUE_H_INCLUDED_
  8. #define _NGX_QUEUE_H_INCLUDED_


  9. typedef struct ngx_queue_s  ngx_queue_t;

  10. struct ngx_queue_s {
  11.     ngx_queue_t  *prev;
  12.     ngx_queue_t  *next;
  13. };


  14. #define ngx_queue_init(q)                                                     \
  15.     (q)->prev = q;                                                            \
  16.     (q)->next = q


  17. #define ngx_queue_empty(h)                                                    \
  18.     (h == (h)->prev)


  19. #define ngx_queue_insert_head(h, x)                                           \
  20.     (x)->next = (h)->next;                                                    \
  21.     (x)->next->prev = x;                                                      \
  22.     (x)->prev = h;                                                            \
  23.     (h)->next = x


  24. #define ngx_queue_insert_after   ngx_queue_insert_head


  25. #define ngx_queue_insert_tail(h, x)                                           \
  26.     (x)->prev = (h)->prev;                                                    \
  27.     (x)->prev->next = x;                                                      \
  28.     (x)->next = h;                                                            \
  29.     (h)->prev = x


  30. #define ngx_queue_head(h)                                                     \
  31.     (h)->next


  32. #define ngx_queue_last(h)                                                     \
  33.     (h)->prev


  34. #define ngx_queue_sentinel(h)                                                 \
  35.     (h)


  36. #define ngx_queue_next(q)                                                     \
  37.     (q)->next


  38. #define ngx_queue_prev(q)                                                     \
  39.     (q)->prev


  40. #if (NGX_DEBUG)

  41. #define ngx_queue_remove(x)                                                   \
  42.     (x)->next->prev = (x)->prev;                                              \
  43.     (x)->prev->next = (x)->next;                                              \
  44.     (x)->prev = NULL;                                                         \
  45.     (x)->next = NULL

  46. #else

  47. #define ngx_queue_remove(x)                                                   \
  48.     (x)->next->prev = (x)->prev;                                              \
  49.     (x)->prev->next = (x)->next

  50. #endif


  51. #define ngx_queue_split(h, q, n)                                              \
  52.     (n)->prev = (h)->prev;                                                    \
  53.     (n)->prev->next = n;                                                      \
  54.     (n)->next = q;                                                            \
  55.     (h)->prev = (q)->prev;                                                    \
  56.     (h)->prev->next = h;                                                      \
  57.     (q)->prev = n;


  58. #define ngx_queue_add(h, n)                                                   \
  59.     (h)->prev->next = (n)->next;                                              \
  60.     (n)->next->prev = (h)->prev;                                              \
  61.     (h)->prev = (n)->prev;                                                    \
  62.     (h)->prev->next = h;


  63. #define ngx_queue_data(q, type, link)                                         \
  64.     (type *) ((u_char *) q - offsetof(type, link))


  65. ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);
  66. void ngx_queue_sort(ngx_queue_t *queue,
  67.     ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));


  68. #endif /* _NGX_QUEUE_H_INCLUDED_ */