xref: /unit/src/nxt_list.c (revision 108:f87c1c4e22be)
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 #include <nxt_main.h>
80Sigor@sysoev.ru 
90Sigor@sysoev.ru 
100Sigor@sysoev.ru nxt_list_t *
nxt_list_create(nxt_mp_t * mp,nxt_uint_t n,size_t size)1165Sigor@sysoev.ru nxt_list_create(nxt_mp_t *mp, nxt_uint_t n, size_t size)
120Sigor@sysoev.ru {
130Sigor@sysoev.ru     nxt_list_t  *list;
140Sigor@sysoev.ru 
1565Sigor@sysoev.ru     list = nxt_mp_get(mp, sizeof(nxt_list_t) + n * size);
160Sigor@sysoev.ru 
170Sigor@sysoev.ru     if (nxt_fast_path(list != NULL)) {
180Sigor@sysoev.ru         list->last = &list->part;
190Sigor@sysoev.ru         list->size = size;
200Sigor@sysoev.ru         list->nalloc = n;
210Sigor@sysoev.ru         list->mem_pool = mp;
220Sigor@sysoev.ru         list->part.next = NULL;
230Sigor@sysoev.ru         list->part.nelts = 0;
240Sigor@sysoev.ru     }
250Sigor@sysoev.ru 
260Sigor@sysoev.ru     return list;
270Sigor@sysoev.ru }
280Sigor@sysoev.ru 
290Sigor@sysoev.ru 
300Sigor@sysoev.ru void *
nxt_list_add(nxt_list_t * list)310Sigor@sysoev.ru nxt_list_add(nxt_list_t *list)
320Sigor@sysoev.ru {
330Sigor@sysoev.ru     void             *elt;
340Sigor@sysoev.ru     nxt_list_part_t  *last;
350Sigor@sysoev.ru 
360Sigor@sysoev.ru     last = list->last;
370Sigor@sysoev.ru 
380Sigor@sysoev.ru     if (last->nelts == list->nalloc) {
390Sigor@sysoev.ru 
400Sigor@sysoev.ru         /* The last list part is filled up, allocating a new list part. */
410Sigor@sysoev.ru 
4265Sigor@sysoev.ru         last = nxt_mp_get(list->mem_pool,
4365Sigor@sysoev.ru                           sizeof(nxt_list_part_t) + list->nalloc * list->size);
440Sigor@sysoev.ru 
450Sigor@sysoev.ru         if (nxt_slow_path(last == NULL)) {
460Sigor@sysoev.ru             return NULL;
470Sigor@sysoev.ru         }
480Sigor@sysoev.ru 
490Sigor@sysoev.ru         last->next = NULL;
500Sigor@sysoev.ru         last->nelts = 0;
510Sigor@sysoev.ru 
520Sigor@sysoev.ru         list->last->next = last;
530Sigor@sysoev.ru         list->last = last;
540Sigor@sysoev.ru     }
550Sigor@sysoev.ru 
56*108Sigor@sysoev.ru     elt = nxt_pointer_to(nxt_list_data(last), last->nelts * list->size);
570Sigor@sysoev.ru     last->nelts++;
580Sigor@sysoev.ru 
590Sigor@sysoev.ru     return elt;
600Sigor@sysoev.ru }
610Sigor@sysoev.ru 
620Sigor@sysoev.ru 
630Sigor@sysoev.ru void *
nxt_list_zero_add(nxt_list_t * list)640Sigor@sysoev.ru nxt_list_zero_add(nxt_list_t *list)
650Sigor@sysoev.ru {
660Sigor@sysoev.ru     void  *p;
670Sigor@sysoev.ru 
680Sigor@sysoev.ru     p = nxt_list_add(list);
690Sigor@sysoev.ru 
700Sigor@sysoev.ru     if (nxt_fast_path(p != NULL)) {
710Sigor@sysoev.ru         nxt_memzero(p, list->size);
720Sigor@sysoev.ru     }
730Sigor@sysoev.ru 
740Sigor@sysoev.ru     return p;
750Sigor@sysoev.ru }
760Sigor@sysoev.ru 
770Sigor@sysoev.ru 
780Sigor@sysoev.ru void *
nxt_list_next(nxt_list_t * list,nxt_list_next_t * next)790Sigor@sysoev.ru nxt_list_next(nxt_list_t *list, nxt_list_next_t *next)
800Sigor@sysoev.ru {
810Sigor@sysoev.ru     if (next->part != NULL) {
820Sigor@sysoev.ru         next->elt++;
830Sigor@sysoev.ru 
840Sigor@sysoev.ru         if (next->elt < next->part->nelts) {
850Sigor@sysoev.ru             return nxt_list_next_value(list, next);
860Sigor@sysoev.ru         }
870Sigor@sysoev.ru 
880Sigor@sysoev.ru         next->part = next->part->next;
890Sigor@sysoev.ru 
900Sigor@sysoev.ru         if (next->part != NULL) {
910Sigor@sysoev.ru             next->elt = 0;
920Sigor@sysoev.ru             return nxt_list_data(next->part);
930Sigor@sysoev.ru         }
940Sigor@sysoev.ru 
950Sigor@sysoev.ru     } else {
960Sigor@sysoev.ru         next->part = nxt_list_part(list);
970Sigor@sysoev.ru         /*
980Sigor@sysoev.ru          * The first list part is allocated together with
990Sigor@sysoev.ru          * a nxt_list_t itself and it may never be NULL.
1000Sigor@sysoev.ru          */
1010Sigor@sysoev.ru         if (next->part->nelts != 0) {
1020Sigor@sysoev.ru             return nxt_list_data(next->part);
1030Sigor@sysoev.ru         }
1040Sigor@sysoev.ru 
1050Sigor@sysoev.ru     }
1060Sigor@sysoev.ru 
1070Sigor@sysoev.ru     return NULL;
1080Sigor@sysoev.ru }
109