Mercurial > hg > nginx-quic
annotate src/http/ngx_http_write_filter_module.c @ 7162:8b84d60ef13d
Fixed "changing binary" when reaper is not init.
On some systems, it's possible that reaper of orphaned processes is
set to something other than "init" process. On such systems, the
changing binary procedure did not work.
The fix is to check if PPID has changed, instead of assuming it's
always 1 for orphaned processes.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Tue, 28 Nov 2017 12:00:24 +0300 |
parents | f01ab2dbcfdc |
children | a7ff19afbb14 |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
4412 | 4 * Copyright (C) Nginx, Inc. |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
5 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
6 |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
9 #include <ngx_core.h> |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
10 #include <ngx_http.h> |
43
53cd05892261
nginx-0.0.1-2002-12-27-19:22:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
42
diff
changeset
|
11 |
53cd05892261
nginx-0.0.1-2002-12-27-19:22:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
42
diff
changeset
|
12 |
681 | 13 static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf); |
10
4f3879d9b6f6
nginx-0.0.1-2002-09-11-19:18:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
9
diff
changeset
|
14 |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
15 |
667 | 16 static ngx_http_module_t ngx_http_write_filter_module_ctx = { |
509 | 17 NULL, /* preconfiguration */ |
681 | 18 ngx_http_write_filter_init, /* postconfiguration */ |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
19 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
20 NULL, /* create main configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
21 NULL, /* init main configuration */ |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
67
diff
changeset
|
22 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
23 NULL, /* create server configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
24 NULL, /* merge server configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
25 |
391
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
26 NULL, /* create location configuration */ |
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
27 NULL, /* merge location configuration */ |
10
4f3879d9b6f6
nginx-0.0.1-2002-09-11-19:18:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
9
diff
changeset
|
28 }; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
29 |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
30 |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
31 ngx_module_t ngx_http_write_filter_module = { |
509 | 32 NGX_MODULE_V1, |
90
37530da31268
nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
83
diff
changeset
|
33 &ngx_http_write_filter_module_ctx, /* module context */ |
391
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
34 NULL, /* module directives */ |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
91
diff
changeset
|
35 NGX_HTTP_MODULE, /* module type */ |
541 | 36 NULL, /* init master */ |
681 | 37 NULL, /* init module */ |
541 | 38 NULL, /* init process */ |
39 NULL, /* init thread */ | |
40 NULL, /* exit thread */ | |
41 NULL, /* exit process */ | |
42 NULL, /* exit master */ | |
43 NGX_MODULE_V1_PADDING | |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
44 }; |
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
45 |
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
46 |
501 | 47 ngx_int_t |
48 ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in) | |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
49 { |
2907 | 50 off_t size, sent, nsent, limit; |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
51 ngx_uint_t last, flush, sync; |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
52 ngx_msec_t delay; |
509 | 53 ngx_chain_t *cl, *ln, **ll, *chain; |
54 ngx_connection_t *c; | |
55 ngx_http_core_loc_conf_t *clcf; | |
9
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
56 |
527 | 57 c = r->connection; |
58 | |
583 | 59 if (c->error) { |
527 | 60 return NGX_ERROR; |
61 } | |
62 | |
303
00c5660d2707
nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
63 size = 0; |
00c5660d2707
nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
64 flush = 0; |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
65 sync = 0; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
66 last = 0; |
509 | 67 ll = &r->out; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
68 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
69 /* find the size, the flush point and the last link of the saved chain */ |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
70 |
509 | 71 for (cl = r->out; cl; cl = cl->next) { |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
72 ll = &cl->next; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
73 |
667 | 74 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 75 "write old buf t:%d f:%d %p, pos %p, size: %z " |
6044
b8926ba4d087
Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5926
diff
changeset
|
76 "file: %O, size: %O", |
479 | 77 cl->buf->temporary, cl->buf->in_file, |
78 cl->buf->start, cl->buf->pos, | |
79 cl->buf->last - cl->buf->pos, | |
80 cl->buf->file_pos, | |
81 cl->buf->file_last - cl->buf->file_pos); | |
82 | |
461 | 83 #if 1 |
84 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 85 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 86 "zero size buf in writer " |
87 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
88 cl->buf->temporary, | |
89 cl->buf->recycled, | |
90 cl->buf->in_file, | |
91 cl->buf->start, | |
92 cl->buf->pos, | |
93 cl->buf->last, | |
94 cl->buf->file, | |
95 cl->buf->file_pos, | |
96 cl->buf->file_last); | |
97 | |
461 | 98 ngx_debug_point(); |
489 | 99 return NGX_ERROR; |
461 | 100 } |
101 #endif | |
102 | |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
103 size += ngx_buf_size(cl->buf); |
3
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
1
diff
changeset
|
104 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
105 if (cl->buf->flush || cl->buf->recycled) { |
499 | 106 flush = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
107 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
108 |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
109 if (cl->buf->sync) { |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
110 sync = 1; |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
111 } |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
112 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
113 if (cl->buf->last_buf) { |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
114 last = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
115 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
116 } |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
117 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
118 /* add the new chain to the existent one */ |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
119 |
332
159dd60d257a
nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
120 for (ln = in; ln; ln = ln->next) { |
501 | 121 cl = ngx_alloc_chain_link(r->pool); |
122 if (cl == NULL) { | |
461 | 123 return NGX_ERROR; |
124 } | |
125 | |
126 cl->buf = ln->buf; | |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
127 *ll = cl; |
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
128 ll = &cl->next; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
129 |
667 | 130 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 131 "write new buf t:%d f:%d %p, pos %p, size: %z " |
6044
b8926ba4d087
Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5926
diff
changeset
|
132 "file: %O, size: %O", |
479 | 133 cl->buf->temporary, cl->buf->in_file, |
134 cl->buf->start, cl->buf->pos, | |
135 cl->buf->last - cl->buf->pos, | |
136 cl->buf->file_pos, | |
137 cl->buf->file_last - cl->buf->file_pos); | |
138 | |
461 | 139 #if 1 |
140 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 141 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 142 "zero size buf in writer " |
143 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
144 cl->buf->temporary, | |
145 cl->buf->recycled, | |
146 cl->buf->in_file, | |
147 cl->buf->start, | |
148 cl->buf->pos, | |
149 cl->buf->last, | |
150 cl->buf->file, | |
151 cl->buf->file_pos, | |
152 cl->buf->file_last); | |
153 | |
461 | 154 ngx_debug_point(); |
489 | 155 return NGX_ERROR; |
461 | 156 } |
157 #endif | |
158 | |
403
ea3113b181d1
nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
402
diff
changeset
|
159 size += ngx_buf_size(cl->buf); |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
160 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
161 if (cl->buf->flush || cl->buf->recycled) { |
499 | 162 flush = 1; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
163 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
164 |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
165 if (cl->buf->sync) { |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
166 sync = 1; |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
167 } |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
168 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
169 if (cl->buf->last_buf) { |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
170 last = 1; |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
171 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
172 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
173 |
461 | 174 *ll = NULL; |
175 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
176 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, |
6480 | 177 "http write filter: l:%ui f:%ui s:%O", last, flush, size); |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
178 |
509 | 179 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
154
eac26585476e
nginx-0.0.1-2003-10-22-11:05:29 import
Igor Sysoev <igor@sysoev.ru>
parents:
153
diff
changeset
|
180 |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
119
diff
changeset
|
181 /* |
509 | 182 * avoid the output if there are no last buf, no flush point, |
344
e366ba5db8f8
nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
343
diff
changeset
|
183 * there are the incoming bufs and the size of all bufs |
332
159dd60d257a
nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
184 * is smaller than "postpone_output" directive |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
119
diff
changeset
|
185 */ |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
186 |
499 | 187 if (!last && !flush && in && size < (off_t) clcf->postpone_output) { |
4
c5f071d376e5
nginx-0.0.1-2002-08-22-19:24:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
188 return NGX_OK; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
189 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
190 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
191 if (c->write->delayed) { |
597 | 192 c->buffered |= NGX_HTTP_WRITE_BUFFERED; |
77
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
193 return NGX_AGAIN; |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
194 } |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
195 |
5513
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
196 if (size == 0 |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
197 && !(c->buffered & NGX_LOWLEVEL_BUFFERED) |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
198 && !(last && c->need_last_buf)) |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
199 { |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
200 if (last || flush || sync) { |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
201 for (cl = r->out; cl; /* void */) { |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
202 ln = cl; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
203 cl = cl->next; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
204 ngx_free_chain(r->pool, ln); |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
205 } |
597 | 206 |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
207 r->out = NULL; |
597 | 208 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; |
501 | 209 |
499 | 210 return NGX_OK; |
211 } | |
212 | |
667 | 213 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 214 "the http output chain is empty"); |
461 | 215 |
483 | 216 ngx_debug_point(); |
217 | |
218 return NGX_ERROR; | |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
219 } |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
220 |
635 | 221 if (r->limit_rate) { |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
222 if (r->limit_rate_after == 0) { |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
223 r->limit_rate_after = clcf->limit_rate_after; |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
224 } |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
225 |
4961
ed576bd1d9c0
Limit rate: fixed integer overflow in limit calculation (ticket #256).
Valentin Bartenev <vbart@nginx.com>
parents:
4833
diff
changeset
|
226 limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1) |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
227 - (c->sent - r->limit_rate_after); |
633 | 228 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
229 if (limit <= 0) { |
635 | 230 c->write->delayed = 1; |
5884
8486205d10db
Write filter: stored delay in a variable, no functional changes.
Roman Arutyunyan <arut@nginx.com>
parents:
5513
diff
changeset
|
231 delay = (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1); |
8486205d10db
Write filter: stored delay in a variable, no functional changes.
Roman Arutyunyan <arut@nginx.com>
parents:
5513
diff
changeset
|
232 ngx_add_timer(c->write, delay); |
635 | 233 |
234 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
235 | |
236 return NGX_AGAIN; | |
237 } | |
238 | |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
239 if (clcf->sendfile_max_chunk |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
240 && (off_t) clcf->sendfile_max_chunk < limit) |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
241 { |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
242 limit = clcf->sendfile_max_chunk; |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
243 } |
1197 | 244 |
635 | 245 } else { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
246 limit = clcf->sendfile_max_chunk; |
633 | 247 } |
248 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
249 sent = c->sent; |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
356
diff
changeset
|
250 |
633 | 251 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
252 "http write filter limit %O", limit); |
633 | 253 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
254 chain = c->send_chain(c, r->out, limit); |
61
4f3e2abcc2c4
nginx-0.0.1-2003-02-11-19:42:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
255 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
256 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 257 "http write filter %p", chain); |
61
4f3e2abcc2c4
nginx-0.0.1-2003-02-11-19:42:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
258 |
633 | 259 if (chain == NGX_CHAIN_ERROR) { |
260 c->error = 1; | |
261 return NGX_ERROR; | |
262 } | |
263 | |
1197 | 264 if (r->limit_rate) { |
2907 | 265 |
266 nsent = c->sent; | |
267 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
268 if (r->limit_rate_after) { |
2907 | 269 |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
270 sent -= r->limit_rate_after; |
2907 | 271 if (sent < 0) { |
272 sent = 0; | |
273 } | |
274 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
275 nsent -= r->limit_rate_after; |
2907 | 276 if (nsent < 0) { |
277 nsent = 0; | |
278 } | |
279 } | |
280 | |
4383
5130c16a130e
Fixed throughput problems with large limit_rate.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2907
diff
changeset
|
281 delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate); |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
282 |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
283 if (delay > 0) { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
284 limit = 0; |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
285 c->write->delayed = 1; |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
286 ngx_add_timer(c->write, delay); |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
287 } |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
288 } |
1197 | 289 |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
290 if (limit |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
291 && c->write->ready |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
292 && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize)) |
1408
e67ef50c3176
set delay only when almost whole sendfile_max_chunk was transferred
Igor Sysoev <igor@sysoev.ru>
parents:
1197
diff
changeset
|
293 { |
1197 | 294 c->write->delayed = 1; |
295 ngx_add_timer(c->write, 1); | |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
296 } |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
356
diff
changeset
|
297 |
509 | 298 for (cl = r->out; cl && cl != chain; /* void */) { |
507 | 299 ln = cl; |
300 cl = cl->next; | |
301 ngx_free_chain(r->pool, ln); | |
302 } | |
303 | |
509 | 304 r->out = chain; |
399
4e21d1291a14
nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
305 |
597 | 306 if (chain) { |
307 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
308 return NGX_AGAIN; | |
309 } | |
310 | |
311 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; | |
312 | |
313 if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) { | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
314 return NGX_AGAIN; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
315 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
316 |
399
4e21d1291a14
nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
317 return NGX_OK; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
318 } |
9
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
319 |
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
320 |
501 | 321 static ngx_int_t |
681 | 322 ngx_http_write_filter_init(ngx_conf_t *cf) |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
323 { |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
324 ngx_http_top_body_filter = ngx_http_write_filter; |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
325 |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
326 return NGX_OK; |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
327 } |