| |
| /* |
| * Copyright (C) Igor Sysoev |
| */ |
| |
| |
| #include <ngx_config.h> |
| #include <ngx_core.h> |
| |
| |
| #ifndef _NGX_QUEUE_H_INCLUDED_ |
| #define _NGX_QUEUE_H_INCLUDED_ |
| |
| |
| typedef struct ngx_queue_s ngx_queue_t; |
| |
| struct ngx_queue_s { |
| ngx_queue_t *prev; |
| ngx_queue_t *next; |
| }; |
| |
| |
| #define ngx_queue_init(q) \ |
| (q)->prev = q; \ |
| (q)->next = q |
| |
| |
| #define ngx_queue_empty(h) \ |
| (h == (h)->prev) |
| |
| |
| #define ngx_queue_insert_head(h, x) \ |
| (x)->next = (h)->next; \ |
| (x)->next->prev = x; \ |
| (x)->prev = h; \ |
| (h)->next = x |
| |
| |
| #define ngx_queue_head(h) \ |
| (h)->next |
| |
| |
| #define ngx_queue_last(h) \ |
| (h)->prev |
| |
| |
| #if (NGX_DEBUG) |
| |
| #define ngx_queue_remove(x) \ |
| (x)->next->prev = (x)->prev; \ |
| (x)->prev->next = (x)->next; \ |
| (x)->prev = NULL; \ |
| (x)->next = NULL |
| |
| #else |
| |
| #define ngx_queue_remove(x) \ |
| (x)->next->prev = (x)->prev; \ |
| (x)->prev->next = (x)->next |
| |
| #endif |
| |
| |
| #define ngx_queue_data(q, type, link) \ |
| (type *) ((u_char *) q - offsetof(type, link)) |
| |
| |
| #endif /* _NGX_QUEUE_H_INCLUDED_ */ |