upstream nginx-0.7.31
[nginx.git] / nginx / src / core / ngx_list.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_LIST_H_INCLUDED_
8 #define _NGX_LIST_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13
14
15 typedef struct ngx_list_part_s  ngx_list_part_t;
16
17 struct ngx_list_part_s {
18     void             *elts;
19     ngx_uint_t        nelts;
20     ngx_list_part_t  *next;
21 };
22
23
24 typedef struct {
25     ngx_list_part_t  *last;
26     ngx_list_part_t   part;
27     size_t            size;
28     ngx_uint_t        nalloc;
29     ngx_pool_t       *pool;
30 } ngx_list_t;
31
32
33 ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);
34
35 static ngx_inline ngx_int_t
36 ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
37 {
38     list->part.elts = ngx_palloc(pool, n * size);
39     if (list->part.elts == NULL) {
40         return NGX_ERROR;
41     }
42
43     list->part.nelts = 0;
44     list->part.next = NULL;
45     list->last = &list->part;
46     list->size = size;
47     list->nalloc = n;
48     list->pool = pool;
49
50     return NGX_OK;
51 }
52
53
54 /*
55  *
56  *  the iteration through the list:
57  *
58  *  part = &list.part;
59  *  data = part->elts;
60  *
61  *  for (i = 0 ;; i++) {
62  *
63  *      if (i >= part->nelts) {
64  *          if (part->next == NULL) {
65  *              break;
66  *          }
67  *
68  *          part = part->next;
69  *          data = part->elts;
70  *          i = 0;
71  *      }
72  *
73  *      ...  data[i] ...
74  *
75  *  }
76  */
77
78
79 void *ngx_list_push(ngx_list_t *list);
80
81
82 #endif /* _NGX_LIST_H_INCLUDED_ */