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 }