xref: /unit/src/nxt_buf.c (revision 0)
1*0Sigor@sysoev.ru 
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru  */
6*0Sigor@sysoev.ru 
7*0Sigor@sysoev.ru #include <nxt_main.h>
8*0Sigor@sysoev.ru 
9*0Sigor@sysoev.ru 
10*0Sigor@sysoev.ru static void nxt_buf_completion(nxt_thread_t *thr, void *obj, void *data);
11*0Sigor@sysoev.ru 
12*0Sigor@sysoev.ru 
13*0Sigor@sysoev.ru nxt_buf_t *
14*0Sigor@sysoev.ru nxt_buf_mem_alloc(nxt_mem_pool_t *mp, size_t size, nxt_uint_t flags)
15*0Sigor@sysoev.ru {
16*0Sigor@sysoev.ru     nxt_buf_t  *b;
17*0Sigor@sysoev.ru 
18*0Sigor@sysoev.ru     b = nxt_mem_cache_zalloc0(mp, NXT_BUF_MEM_SIZE);
19*0Sigor@sysoev.ru     if (nxt_slow_path(b == NULL)) {
20*0Sigor@sysoev.ru         return NULL;
21*0Sigor@sysoev.ru     }
22*0Sigor@sysoev.ru 
23*0Sigor@sysoev.ru     b->data = mp;
24*0Sigor@sysoev.ru     b->completion_handler = nxt_buf_completion;
25*0Sigor@sysoev.ru     b->size = NXT_BUF_MEM_SIZE;
26*0Sigor@sysoev.ru 
27*0Sigor@sysoev.ru     if (size != 0) {
28*0Sigor@sysoev.ru         b->mem.start = nxt_mem_buf(mp, &size, flags);
29*0Sigor@sysoev.ru         if (nxt_slow_path(b->mem.start == NULL)) {
30*0Sigor@sysoev.ru             return NULL;
31*0Sigor@sysoev.ru         }
32*0Sigor@sysoev.ru 
33*0Sigor@sysoev.ru         b->mem.pos = b->mem.start;
34*0Sigor@sysoev.ru         b->mem.free = b->mem.start;
35*0Sigor@sysoev.ru         b->mem.end = b->mem.start + size;
36*0Sigor@sysoev.ru     }
37*0Sigor@sysoev.ru 
38*0Sigor@sysoev.ru     return b;
39*0Sigor@sysoev.ru }
40*0Sigor@sysoev.ru 
41*0Sigor@sysoev.ru 
42*0Sigor@sysoev.ru nxt_buf_t *
43*0Sigor@sysoev.ru nxt_buf_file_alloc(nxt_mem_pool_t *mp, size_t size, nxt_uint_t flags)
44*0Sigor@sysoev.ru {
45*0Sigor@sysoev.ru     nxt_buf_t  *b;
46*0Sigor@sysoev.ru 
47*0Sigor@sysoev.ru     b = nxt_mem_cache_zalloc0(mp, NXT_BUF_FILE_SIZE);
48*0Sigor@sysoev.ru     if (nxt_slow_path(b == NULL)) {
49*0Sigor@sysoev.ru         return NULL;
50*0Sigor@sysoev.ru     }
51*0Sigor@sysoev.ru 
52*0Sigor@sysoev.ru     b->data = mp;
53*0Sigor@sysoev.ru     b->completion_handler = nxt_buf_completion;
54*0Sigor@sysoev.ru     b->size = NXT_BUF_FILE_SIZE;
55*0Sigor@sysoev.ru     nxt_buf_set_file(b);
56*0Sigor@sysoev.ru 
57*0Sigor@sysoev.ru     if (size != 0) {
58*0Sigor@sysoev.ru         b->mem.start = nxt_mem_buf(mp, &size, flags);
59*0Sigor@sysoev.ru         if (nxt_slow_path(b->mem.start == NULL)) {
60*0Sigor@sysoev.ru             return NULL;
61*0Sigor@sysoev.ru         }
62*0Sigor@sysoev.ru 
63*0Sigor@sysoev.ru         b->mem.pos = b->mem.start;
64*0Sigor@sysoev.ru         b->mem.free = b->mem.start;
65*0Sigor@sysoev.ru         b->mem.end = b->mem.start + size;
66*0Sigor@sysoev.ru     }
67*0Sigor@sysoev.ru 
68*0Sigor@sysoev.ru     return b;
69*0Sigor@sysoev.ru }
70*0Sigor@sysoev.ru 
71*0Sigor@sysoev.ru 
72*0Sigor@sysoev.ru nxt_buf_t *
73*0Sigor@sysoev.ru nxt_buf_mmap_alloc(nxt_mem_pool_t *mp, size_t size)
74*0Sigor@sysoev.ru {
75*0Sigor@sysoev.ru     nxt_buf_t  *b;
76*0Sigor@sysoev.ru 
77*0Sigor@sysoev.ru     b = nxt_mem_cache_zalloc0(mp, NXT_BUF_MMAP_SIZE);
78*0Sigor@sysoev.ru 
79*0Sigor@sysoev.ru     if (nxt_fast_path(b != NULL)) {
80*0Sigor@sysoev.ru         b->data = mp;
81*0Sigor@sysoev.ru         b->completion_handler = nxt_buf_completion;
82*0Sigor@sysoev.ru         b->size = NXT_BUF_MMAP_SIZE;
83*0Sigor@sysoev.ru 
84*0Sigor@sysoev.ru         nxt_buf_set_file(b);
85*0Sigor@sysoev.ru         nxt_buf_set_mmap(b);
86*0Sigor@sysoev.ru         nxt_buf_mem_set_size(&b->mem, size);
87*0Sigor@sysoev.ru     }
88*0Sigor@sysoev.ru 
89*0Sigor@sysoev.ru     return b;
90*0Sigor@sysoev.ru }
91*0Sigor@sysoev.ru 
92*0Sigor@sysoev.ru 
93*0Sigor@sysoev.ru nxt_buf_t *
94*0Sigor@sysoev.ru nxt_buf_sync_alloc(nxt_mem_pool_t *mp, nxt_uint_t flags)
95*0Sigor@sysoev.ru {
96*0Sigor@sysoev.ru     nxt_buf_t  *b;
97*0Sigor@sysoev.ru 
98*0Sigor@sysoev.ru     b = nxt_mem_cache_zalloc0(mp, NXT_BUF_SYNC_SIZE);
99*0Sigor@sysoev.ru 
100*0Sigor@sysoev.ru     if (nxt_fast_path(b != NULL)) {
101*0Sigor@sysoev.ru         b->data = mp;
102*0Sigor@sysoev.ru         b->completion_handler = nxt_buf_completion;
103*0Sigor@sysoev.ru         b->size = NXT_BUF_SYNC_SIZE;
104*0Sigor@sysoev.ru 
105*0Sigor@sysoev.ru         nxt_buf_set_sync(b);
106*0Sigor@sysoev.ru         b->is_nobuf = ((flags & NXT_BUF_SYNC_NOBUF) != 0);
107*0Sigor@sysoev.ru         b->is_flush = ((flags & NXT_BUF_SYNC_FLUSH) != 0);
108*0Sigor@sysoev.ru         b->is_last = ((flags & NXT_BUF_SYNC_LAST) != 0);
109*0Sigor@sysoev.ru     }
110*0Sigor@sysoev.ru 
111*0Sigor@sysoev.ru     return b;
112*0Sigor@sysoev.ru }
113*0Sigor@sysoev.ru 
114*0Sigor@sysoev.ru 
115*0Sigor@sysoev.ru void
116*0Sigor@sysoev.ru nxt_buf_chain_add(nxt_buf_t **head, nxt_buf_t *in)
117*0Sigor@sysoev.ru {
118*0Sigor@sysoev.ru     nxt_buf_t  *b, **prev;
119*0Sigor@sysoev.ru 
120*0Sigor@sysoev.ru     prev = head;
121*0Sigor@sysoev.ru 
122*0Sigor@sysoev.ru     for (b = *head; b != NULL; b = b->next) {
123*0Sigor@sysoev.ru         prev = &b->next;
124*0Sigor@sysoev.ru     }
125*0Sigor@sysoev.ru 
126*0Sigor@sysoev.ru     *prev = in;
127*0Sigor@sysoev.ru }
128*0Sigor@sysoev.ru 
129*0Sigor@sysoev.ru 
130*0Sigor@sysoev.ru size_t
131*0Sigor@sysoev.ru nxt_buf_chain_length(nxt_buf_t *b)
132*0Sigor@sysoev.ru {
133*0Sigor@sysoev.ru     size_t  length;
134*0Sigor@sysoev.ru 
135*0Sigor@sysoev.ru     length = 0;
136*0Sigor@sysoev.ru 
137*0Sigor@sysoev.ru     while (b != NULL) {
138*0Sigor@sysoev.ru         length += b->mem.free - b->mem.pos;
139*0Sigor@sysoev.ru         b = b->next;
140*0Sigor@sysoev.ru     }
141*0Sigor@sysoev.ru 
142*0Sigor@sysoev.ru     return length;
143*0Sigor@sysoev.ru }
144*0Sigor@sysoev.ru 
145*0Sigor@sysoev.ru 
146*0Sigor@sysoev.ru static void
147*0Sigor@sysoev.ru nxt_buf_completion(nxt_thread_t *thr, void *obj, void *data)
148*0Sigor@sysoev.ru {
149*0Sigor@sysoev.ru     nxt_buf_t       *b, *parent;
150*0Sigor@sysoev.ru     nxt_mem_pool_t  *mp;
151*0Sigor@sysoev.ru 
152*0Sigor@sysoev.ru     b = obj;
153*0Sigor@sysoev.ru     parent = data;
154*0Sigor@sysoev.ru 
155*0Sigor@sysoev.ru     nxt_log_debug(thr->log, "buf completion: %p %p", b, b->mem.start);
156*0Sigor@sysoev.ru 
157*0Sigor@sysoev.ru     mp = b->data;
158*0Sigor@sysoev.ru     nxt_buf_free(mp, b);
159*0Sigor@sysoev.ru 
160*0Sigor@sysoev.ru     if (parent != NULL) {
161*0Sigor@sysoev.ru         nxt_log_debug(thr->log, "parent retain:%uD", parent->retain);
162*0Sigor@sysoev.ru 
163*0Sigor@sysoev.ru         parent->retain--;
164*0Sigor@sysoev.ru 
165*0Sigor@sysoev.ru         if (parent->retain == 0) {
166*0Sigor@sysoev.ru             parent->mem.pos = parent->mem.free;
167*0Sigor@sysoev.ru 
168*0Sigor@sysoev.ru             parent->completion_handler(thr, parent, parent->parent);
169*0Sigor@sysoev.ru         }
170*0Sigor@sysoev.ru     }
171*0Sigor@sysoev.ru }
172