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