0
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9
|
|
10
|
48
|
11 ngx_buf_t *
|
|
12 ngx_create_temp_buf(ngx_pool_t *pool, size_t size)
|
0
|
13 {
|
|
14 ngx_buf_t *b;
|
|
15
|
|
16 if (!(b = ngx_calloc_buf(pool))) {
|
|
17 return NULL;
|
|
18 }
|
|
19
|
|
20 if (!(b->start = ngx_palloc(pool, size))) {
|
|
21 return NULL;
|
|
22 }
|
|
23
|
48
|
24 /*
|
|
25 * set by ngx_calloc_buf():
|
|
26 *
|
|
27 * b->file_pos = 0;
|
|
28 * b->file_last = 0;
|
|
29 * b->file = NULL;
|
|
30 * b->shadow = NULL;
|
|
31 * b->tag = 0;
|
|
32 *
|
|
33 */
|
|
34
|
0
|
35 b->pos = b->start;
|
|
36 b->last = b->start;
|
|
37 b->end = b->last + size;
|
|
38 b->temporary = 1;
|
|
39
|
|
40 return b;
|
|
41 }
|
|
42
|
|
43
|
48
|
44 ngx_chain_t *
|
|
45 ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
|
0
|
46 {
|
|
47 u_char *p;
|
|
48 ngx_int_t i;
|
|
49 ngx_buf_t *b;
|
|
50 ngx_chain_t *chain, *cl, **ll;
|
|
51
|
|
52 if (!(p = ngx_palloc(pool, bufs->num * bufs->size))) {
|
|
53 return NULL;
|
|
54 }
|
|
55
|
|
56 ll = &chain;
|
|
57
|
|
58 for (i = 0; i < bufs->num; i++) {
|
|
59 if (!(b = ngx_calloc_buf(pool))) {
|
|
60 return NULL;
|
|
61 }
|
|
62
|
48
|
63 /*
|
|
64 * set by ngx_calloc_buf():
|
|
65 *
|
|
66 * b->file_pos = 0;
|
|
67 * b->file_last = 0;
|
|
68 * b->file = NULL;
|
|
69 * b->shadow = NULL;
|
|
70 * b->tag = 0;
|
|
71 *
|
|
72 */
|
|
73
|
0
|
74 b->pos = p;
|
|
75 b->last = p;
|
|
76 b->temporary = 1;
|
|
77
|
|
78 b->start = p;
|
|
79 p += bufs->size;
|
|
80 b->end = p;
|
|
81
|
|
82 if (!(cl = ngx_alloc_chain_link(pool))) {
|
|
83 return NULL;
|
|
84 }
|
|
85
|
|
86 cl->buf = b;
|
|
87 *ll = cl;
|
|
88 ll = &cl->next;
|
|
89 }
|
|
90
|
|
91 *ll = NULL;
|
|
92
|
|
93 return chain;
|
|
94 }
|
|
95
|
|
96
|
48
|
97 ngx_int_t
|
|
98 ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)
|
0
|
99 {
|
|
100 ngx_chain_t *cl, **ll;
|
|
101
|
|
102 ll = chain;
|
|
103
|
|
104 for (cl = *chain; cl; cl = cl->next) {
|
|
105 ll = &cl->next;
|
|
106 }
|
|
107
|
|
108 while (in) {
|
|
109 ngx_test_null(cl, ngx_alloc_chain_link(pool), NGX_ERROR);
|
|
110
|
|
111 cl->buf = in->buf;
|
|
112 *ll = cl;
|
|
113 ll = &cl->next;
|
|
114 in = in->next;
|
|
115 }
|
|
116
|
|
117 *ll = NULL;
|
|
118
|
|
119 return NGX_OK;
|
|
120 }
|
|
121
|
|
122
|
48
|
123 void
|
|
124 ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
|
|
125 ngx_chain_t **out, ngx_buf_tag_t tag)
|
0
|
126 {
|
48
|
127 ngx_chain_t *cl;
|
0
|
128
|
|
129 if (*busy == NULL) {
|
|
130 *busy = *out;
|
|
131
|
|
132 } else {
|
48
|
133 for (cl = *busy; cl->next; cl = cl->next) { /* void */ }
|
4
|
134
|
48
|
135 cl->next = *out;
|
0
|
136 }
|
|
137
|
|
138 *out = NULL;
|
|
139
|
|
140 while (*busy) {
|
|
141 if (ngx_buf_size((*busy)->buf) != 0) {
|
|
142 break;
|
|
143 }
|
|
144
|
18
|
145 #if (NGX_HAVE_WRITE_ZEROCOPY)
|
0
|
146 if ((*busy)->buf->zerocopy_busy) {
|
|
147 break;
|
|
148 }
|
|
149 #endif
|
|
150
|
|
151 if ((*busy)->buf->tag != tag) {
|
|
152 *busy = (*busy)->next;
|
|
153 continue;
|
|
154 }
|
|
155
|
2
|
156 (*busy)->buf->pos = (*busy)->buf->start;
|
|
157 (*busy)->buf->last = (*busy)->buf->start;
|
0
|
158
|
48
|
159 cl = *busy;
|
|
160 *busy = cl->next;
|
|
161 cl->next = *free;
|
|
162 *free = cl;
|
0
|
163 }
|
|
164 }
|