xref: /unit/src/nxt_list.h (revision 2084:7d479274f334)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #ifndef _NXT_LIST_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_LIST_H_INCLUDED_
90Sigor@sysoev.ru 
100Sigor@sysoev.ru 
110Sigor@sysoev.ru typedef struct nxt_list_part_s  nxt_list_part_t;
120Sigor@sysoev.ru 
130Sigor@sysoev.ru struct nxt_list_part_s {
140Sigor@sysoev.ru     nxt_list_part_t             *next;
150Sigor@sysoev.ru     uintptr_t                   nelts;
16382Smax.romanov@nginx.com     char                        data[];
170Sigor@sysoev.ru };
180Sigor@sysoev.ru 
190Sigor@sysoev.ru 
200Sigor@sysoev.ru typedef struct {
210Sigor@sysoev.ru     nxt_list_part_t             *last;
220Sigor@sysoev.ru #if (NXT_64BIT)
230Sigor@sysoev.ru     uint32_t                    size;
240Sigor@sysoev.ru     uint32_t                    nalloc;
250Sigor@sysoev.ru #else
260Sigor@sysoev.ru     uint16_t                    size;
270Sigor@sysoev.ru     uint16_t                    nalloc;
280Sigor@sysoev.ru #endif
2965Sigor@sysoev.ru     nxt_mp_t                    *mem_pool;
300Sigor@sysoev.ru     nxt_list_part_t             part;
310Sigor@sysoev.ru } nxt_list_t;
320Sigor@sysoev.ru 
330Sigor@sysoev.ru 
340Sigor@sysoev.ru typedef struct {
350Sigor@sysoev.ru     nxt_list_part_t             *part;
360Sigor@sysoev.ru     uintptr_t                   elt;
370Sigor@sysoev.ru } nxt_list_next_t;
380Sigor@sysoev.ru 
390Sigor@sysoev.ru 
40*2084Salx.manpages@gmail.com #define nxt_list_part(list)                                                   \
410Sigor@sysoev.ru     (&(list)->part)
420Sigor@sysoev.ru 
430Sigor@sysoev.ru 
44*2084Salx.manpages@gmail.com #define nxt_list_data(part)                                                   \
45382Smax.romanov@nginx.com     ((void *) part->data)
460Sigor@sysoev.ru 
470Sigor@sysoev.ru 
48*2084Salx.manpages@gmail.com #define nxt_list_first(list)                                                  \
49382Smax.romanov@nginx.com     nxt_list_data(nxt_list_part(list))
500Sigor@sysoev.ru 
510Sigor@sysoev.ru 
520Sigor@sysoev.ru nxt_inline void *
nxt_list_elt(nxt_list_t * list,nxt_uint_t n)530Sigor@sysoev.ru nxt_list_elt(nxt_list_t *list, nxt_uint_t n)
540Sigor@sysoev.ru {
550Sigor@sysoev.ru     nxt_list_part_t  *part;
560Sigor@sysoev.ru 
570Sigor@sysoev.ru     if (nxt_fast_path((list) != NULL)) {
580Sigor@sysoev.ru         part = nxt_list_part(list);
590Sigor@sysoev.ru 
600Sigor@sysoev.ru         while (part != NULL) {
610Sigor@sysoev.ru             if (n < (nxt_uint_t) part->nelts) {
62108Sigor@sysoev.ru                 return nxt_pointer_to(nxt_list_data(part), n * (list)->size);
630Sigor@sysoev.ru             }
640Sigor@sysoev.ru 
650Sigor@sysoev.ru             n -= (nxt_uint_t) part->nelts;
660Sigor@sysoev.ru             part = part->next;
670Sigor@sysoev.ru         }
680Sigor@sysoev.ru     }
690Sigor@sysoev.ru 
700Sigor@sysoev.ru     return NULL;
710Sigor@sysoev.ru }
720Sigor@sysoev.ru 
730Sigor@sysoev.ru 
740Sigor@sysoev.ru #define nxt_list_each(elt, list)                                              \
750Sigor@sysoev.ru     do {                                                                      \
7620Sigor@sysoev.ru         if (nxt_fast_path((list) != NULL)) {                                  \
770Sigor@sysoev.ru             void             *_end;                                           \
780Sigor@sysoev.ru             nxt_list_part_t  *_part = nxt_list_part(list);                    \
790Sigor@sysoev.ru                                                                               \
800Sigor@sysoev.ru             do {                                                              \
81382Smax.romanov@nginx.com                 elt = nxt_list_data(_part);                                   \
820Sigor@sysoev.ru                                                                               \
830Sigor@sysoev.ru                 for (_end = (elt + _part->nelts); elt != _end; elt++) {       \
840Sigor@sysoev.ru 
850Sigor@sysoev.ru #define nxt_list_loop                                                         \
860Sigor@sysoev.ru                 }                                                             \
870Sigor@sysoev.ru                                                                               \
880Sigor@sysoev.ru                 _part = _part->next;                                          \
890Sigor@sysoev.ru                                                                               \
900Sigor@sysoev.ru             } while (_part != NULL);                                          \
910Sigor@sysoev.ru         }                                                                     \
920Sigor@sysoev.ru     } while (0)
930Sigor@sysoev.ru 
940Sigor@sysoev.ru 
9565Sigor@sysoev.ru NXT_EXPORT nxt_list_t *nxt_list_create(nxt_mp_t *mp, nxt_uint_t n, size_t size);
960Sigor@sysoev.ru NXT_EXPORT void *nxt_list_add(nxt_list_t *list);
970Sigor@sysoev.ru NXT_EXPORT void *nxt_list_zero_add(nxt_list_t *list);
980Sigor@sysoev.ru 
990Sigor@sysoev.ru NXT_EXPORT void *nxt_list_next(nxt_list_t *list, nxt_list_next_t *next);
1000Sigor@sysoev.ru 
1010Sigor@sysoev.ru 
102*2084Salx.manpages@gmail.com #define nxt_list_next_value(list, next)                                       \
103108Sigor@sysoev.ru     (nxt_pointer_to(nxt_list_data((next)->part), (next)->elt * (list)->size))
1040Sigor@sysoev.ru 
1050Sigor@sysoev.ru 
1060Sigor@sysoev.ru nxt_inline nxt_uint_t
nxt_list_nelts(nxt_list_t * list)1070Sigor@sysoev.ru nxt_list_nelts(nxt_list_t *list)
1080Sigor@sysoev.ru {
1090Sigor@sysoev.ru     nxt_uint_t       n;
1100Sigor@sysoev.ru     nxt_list_part_t  *part;
1110Sigor@sysoev.ru 
1120Sigor@sysoev.ru     n = 0;
1130Sigor@sysoev.ru 
1140Sigor@sysoev.ru     if (nxt_fast_path((list) != NULL)) {
1150Sigor@sysoev.ru         part = nxt_list_part(list);
1160Sigor@sysoev.ru 
1170Sigor@sysoev.ru         do {
1180Sigor@sysoev.ru             n += (nxt_uint_t) part->nelts;
1190Sigor@sysoev.ru             part = part->next;
1200Sigor@sysoev.ru         } while (part != NULL);
1210Sigor@sysoev.ru     }
1220Sigor@sysoev.ru 
1230Sigor@sysoev.ru     return n;
1240Sigor@sysoev.ru }
1250Sigor@sysoev.ru 
1260Sigor@sysoev.ru 
1270Sigor@sysoev.ru #endif /* _NXT_LIST_H_INCLUDED_ */
128