annotate src/core/ngx_output_chain.c @ 6719:cebf5fed00bf

Modules compatibility: removed unneeded IPV6_V6ONLY checks. The IPV6_V6ONLY macro is now checked only while parsing appropriate flag and when using the macro. The ipv6only field in listen structures is always initialized to 1, even if not supported on a given platform. This is expected to prevent a module compiled without IPV6_V6ONLY from accidentally creating dual sockets if loaded into main binary with proper IPV6_V6ONLY support.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 03 Oct 2016 15:58:25 +0300
parents 9fd738b85fad
children 4395758d08e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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: 430
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: 430
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
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4114
diff changeset
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: 430
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: 430
diff changeset
6
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
10 #include <ngx_event.h>
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
13 #if 0
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
14 #define NGX_SENDFILE_LIMIT 4096
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
15 #endif
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
16
2316
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
17 /*
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
18 * When DIRECTIO is enabled FreeBSD, Solaris, and MacOSX read directly
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
19 * to an application memory from a device if parameters are aligned
3053
0d253659da12 directio_alignment
Igor Sysoev <igor@sysoev.ru>
parents: 3052
diff changeset
20 * to device sector boundary (512 bytes). They fallback to usual read
2316
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
21 * operation if the parameters are not aligned.
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
22 * Linux allows DIRECTIO only if the parameters are aligned to a filesystem
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
23 * sector boundary, otherwise it returns EINVAL. The sector size is
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
24 * usually 512 bytes, however, on XFS it may be 4096 bytes.
402797ed988a allow directio on XFS
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
25 */
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
26
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
27 #define NGX_NONE 1
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
467
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
30 static ngx_inline ngx_int_t
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
31 ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf);
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
32 #if (NGX_HAVE_AIO_SENDFILE)
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
33 static ngx_int_t ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx,
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
34 ngx_file_t *file);
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
35 #endif
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
36 static ngx_int_t ngx_output_chain_add_copy(ngx_pool_t *pool,
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
37 ngx_chain_t **chain, ngx_chain_t *in);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
38 static ngx_int_t ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx,
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
39 off_t bsize);
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
40 static ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx,
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
41 off_t bsize);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
42 static ngx_int_t ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
45 ngx_int_t
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
46 ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 {
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
48 off_t bsize;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
49 ngx_int_t rc, last;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 ngx_chain_t *cl, *out, **last_out;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
5966
bcdfc39bf44d Fixed AIO handling in the output chain.
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
52 if (ctx->in == NULL && ctx->busy == NULL
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
53 #if (NGX_HAVE_FILE_AIO || NGX_THREADS)
5966
bcdfc39bf44d Fixed AIO handling in the output chain.
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
54 && !ctx->aio
bcdfc39bf44d Fixed AIO handling in the output chain.
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
55 #endif
bcdfc39bf44d Fixed AIO handling in the output chain.
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
56 )
bcdfc39bf44d Fixed AIO handling in the output chain.
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
57 {
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
58 /*
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
59 * the short path for the case when the ctx->in and ctx->busy chains
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
60 * are empty, the incoming chain is empty too or has the single buf
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
61 * that does not require the copy
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
62 */
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 if (in == NULL) {
294
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
65 return ctx->output_filter(ctx->filter_ctx, in);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
68 if (in->next == NULL
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
69 #if (NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
70 && !(in->buf->in_file && in->buf->file_last > NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
71 #endif
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
72 && ngx_output_chain_as_is(ctx, in->buf))
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 {
294
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
74 return ctx->output_filter(ctx->filter_ctx, in);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
344
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
78 /* add the incoming buf to the chain ctx->in */
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 if (in) {
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
81 if (ngx_output_chain_add_copy(ctx->pool, &ctx->in, in) == NGX_ERROR) {
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 return NGX_ERROR;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
164
84036764e215 nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 162
diff changeset
86 out = NULL;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 last_out = &out;
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
88 last = NGX_NONE;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 for ( ;; ) {
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
92 #if (NGX_HAVE_FILE_AIO || NGX_THREADS)
3776
7450029ff51e file AIO read may be posted inside loop
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
93 if (ctx->aio) {
7450029ff51e file AIO read may be posted inside loop
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
94 return NGX_AGAIN;
7450029ff51e file AIO read may be posted inside loop
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
95 }
7450029ff51e file AIO read may be posted inside loop
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
96 #endif
7450029ff51e file AIO read may be posted inside loop
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
97
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 while (ctx->in) {
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99
320
d621239c30f7 nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
100 /*
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: 334
diff changeset
101 * cycle while there are the ctx->in bufs
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
102 * and there are the free output bufs to copy in
320
d621239c30f7 nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
103 */
d621239c30f7 nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
104
403
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
105 bsize = ngx_buf_size(ctx->in->buf);
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
106
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
107 if (bsize == 0 && !ngx_buf_special(ctx->in->buf)) {
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
108
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
109 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
110 "zero size buf in output "
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
111 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
112 ctx->in->buf->temporary,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
113 ctx->in->buf->recycled,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
114 ctx->in->buf->in_file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
115 ctx->in->buf->start,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
116 ctx->in->buf->pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
117 ctx->in->buf->last,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
118 ctx->in->buf->file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
119 ctx->in->buf->file_pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
120 ctx->in->buf->file_last);
403
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
121
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
122 ngx_debug_point();
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
123
403
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
124 ctx->in = ctx->in->next;
430
1fa5daf7558e nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
125
403
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
126 continue;
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
127 }
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
128
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
129 if (ngx_output_chain_as_is(ctx, ctx->in->buf)) {
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
320
d621239c30f7 nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
131 /* move the chain link to the output chain */
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 cl = ctx->in;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ctx->in = cl->next;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 *last_out = cl;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 last_out = &cl->next;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 cl->next = NULL;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 continue;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142
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: 334
diff changeset
143 if (ctx->buf == NULL) {
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
145 rc = ngx_output_chain_align_file_buf(ctx, bsize);
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
146
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
147 if (rc == NGX_ERROR) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
148 return NGX_ERROR;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
149 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
150
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
151 if (rc != NGX_OK) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
152
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
153 if (ctx->free) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
154
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
155 /* get the free buf */
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
157 cl = ctx->free;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
158 ctx->buf = cl->buf;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
159 ctx->free = cl->next;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
160
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
161 ngx_free_chain(ctx->pool, cl);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
163 } else if (out || ctx->allocated == ctx->bufs.num) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
164
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
165 break;
334
af451db3fe99 nginx-0.0.3-2004-05-12-09:37:55 import
Igor Sysoev <igor@sysoev.ru>
parents: 320
diff changeset
166
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
167 } else if (ngx_output_chain_get_buf(ctx, bsize) != NGX_OK) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
168 return NGX_ERROR;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
169 }
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
173 rc = ngx_output_chain_copy_buf(ctx);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 if (rc == NGX_ERROR) {
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 return rc;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 if (rc == NGX_AGAIN) {
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 if (out) {
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 break;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 }
430
1fa5daf7558e nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
183
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 return rc;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
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: 334
diff changeset
187 /* delete the completed buf from the ctx->in chain */
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188
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: 334
diff changeset
189 if (ngx_buf_size(ctx->in->buf) == 0) {
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 ctx->in = ctx->in->next;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
193 cl = ngx_alloc_chain_link(ctx->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
194 if (cl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
195 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
196 }
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
197
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
198 cl->buf = ctx->buf;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
199 cl->next = NULL;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 *last_out = cl;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 last_out = &cl->next;
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: 334
diff changeset
202 ctx->buf = NULL;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 if (out == NULL && last != NGX_NONE) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
206
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
207 if (ctx->in) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
208 return NGX_AGAIN;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
209 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
210
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 return last;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
294
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
214 last = ctx->output_filter(ctx->filter_ctx, out);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 517
diff changeset
216 if (last == NGX_ERROR || last == NGX_DONE) {
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 517
diff changeset
217 return last;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 517
diff changeset
218 }
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 517
diff changeset
219
4114
5db098f97e0e API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3776
diff changeset
220 ngx_chain_update_chains(ctx->pool, &ctx->free, &ctx->busy, &out,
5db098f97e0e API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3776
diff changeset
221 ctx->tag);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 last_out = &out;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226
467
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
227 static ngx_inline ngx_int_t
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
228 ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf)
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 {
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
230 ngx_uint_t sendfile;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
231
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: 334
diff changeset
232 if (ngx_buf_special(buf)) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
233 return 1;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
234 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
235
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
236 #if (NGX_THREADS)
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
237 if (buf->in_file) {
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
238 buf->file->thread_handler = ctx->thread_handler;
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
239 buf->file->thread_ctx = ctx->filter_ctx;
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
240 }
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
241 #endif
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
242
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
243 if (buf->in_file && buf->file->directio) {
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 return 0;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
247 sendfile = ctx->sendfile;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
248
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
249 #if (NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
250
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
251 if (buf->in_file && buf->file_pos >= NGX_SENDFILE_LIMIT) {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
252 sendfile = 0;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
253 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
254
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
255 #endif
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
256
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
257 if (!sendfile) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
258
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: 334
diff changeset
259 if (!ngx_buf_in_memory(buf)) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
260 return 0;
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 167
diff changeset
261 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 167
diff changeset
262
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: 334
diff changeset
263 buf->in_file = 0;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
266 #if (NGX_HAVE_AIO_SENDFILE)
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
267 if (ctx->aio_preload && buf->in_file) {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
268 (void) ngx_output_chain_aio_setup(ctx, buf->file);
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
269 }
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
270 #endif
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
271
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: 334
diff changeset
272 if (ctx->need_in_memory && !ngx_buf_in_memory(buf)) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
273 return 0;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275
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: 334
diff changeset
276 if (ctx->need_in_temp && (buf->memory || buf->mmap)) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
277 return 0;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
280 return 1;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
284 #if (NGX_HAVE_AIO_SENDFILE)
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
285
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
286 static ngx_int_t
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
287 ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
288 {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
289 ngx_event_aio_t *aio;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
290
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
291 if (file->aio == NULL && ngx_file_aio_init(file, ctx->pool) != NGX_OK) {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
292 return NGX_ERROR;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
293 }
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
294
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
295 aio = file->aio;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
296
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
297 aio->data = ctx->filter_ctx;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
298 aio->preload_handler = ctx->aio_preload;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
299
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
300 return NGX_OK;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
301 }
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
302
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
303 #endif
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
304
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5966
diff changeset
305
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
306 static ngx_int_t
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
307 ngx_output_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
308 ngx_chain_t *in)
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
309 {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
310 ngx_chain_t *cl, **ll;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
311 #if (NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
312 ngx_buf_t *b, *buf;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
313 #endif
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
314
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
315 ll = chain;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
316
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
317 for (cl = *chain; cl; cl = cl->next) {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
318 ll = &cl->next;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
319 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
320
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
321 while (in) {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
322
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
323 cl = ngx_alloc_chain_link(pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
324 if (cl == NULL) {
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
325 return NGX_ERROR;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
326 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
327
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
328 #if (NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
329
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
330 buf = in->buf;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
331
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
332 if (buf->in_file
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
333 && buf->file_pos < NGX_SENDFILE_LIMIT
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
334 && buf->file_last > NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
335 {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
336 /* split a file buf on two bufs by the sendfile limit */
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
337
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
338 b = ngx_calloc_buf(pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
339 if (b == NULL) {
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
340 return NGX_ERROR;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
341 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
342
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
343 ngx_memcpy(b, buf, sizeof(ngx_buf_t));
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
344
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
345 if (ngx_buf_in_memory(buf)) {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
346 buf->pos += (ssize_t) (NGX_SENDFILE_LIMIT - buf->file_pos);
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
347 b->last = buf->pos;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
348 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
349
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
350 buf->file_pos = NGX_SENDFILE_LIMIT;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
351 b->file_last = NGX_SENDFILE_LIMIT;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
352
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
353 cl->buf = b;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
354
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
355 } else {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
356 cl->buf = buf;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
357 in = in->next;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
358 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
359
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
360 #else
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
361 cl->buf = in->buf;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
362 in = in->next;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
363
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
364 #endif
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
365
2910
dc01b26f8de8 leave chain in consistent state on errors
Igor Sysoev <igor@sysoev.ru>
parents: 2899
diff changeset
366 cl->next = NULL;
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
367 *ll = cl;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
368 ll = &cl->next;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
369 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
370
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
371 return NGX_OK;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
372 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
373
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
374
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
375 static ngx_int_t
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
376 ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
377 {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
378 size_t size;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
379 ngx_buf_t *in;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
380
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
381 in = ctx->in->buf;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
382
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
383 if (in->file == NULL || !in->file->directio) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
384 return NGX_DECLINED;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
385 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
386
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
387 ctx->directio = 1;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
388
3053
0d253659da12 directio_alignment
Igor Sysoev <igor@sysoev.ru>
parents: 3052
diff changeset
389 size = (size_t) (in->file_pos - (in->file_pos & ~(ctx->alignment - 1)));
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
390
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
391 if (size == 0) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
392
2240
a83218b65245 fix building on 64-bit platforms, introduced in r2232
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
393 if (bsize >= (off_t) ctx->bufs.size) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
394 return NGX_DECLINED;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
395 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
396
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
397 size = (size_t) bsize;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
398
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
399 } else {
3057
5ea5a90000d5 fix build by msvc, introduced in r3054
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
400 size = (size_t) ctx->alignment - size;
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
401
2240
a83218b65245 fix building on 64-bit platforms, introduced in r2232
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
402 if ((off_t) size > bsize) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
403 size = (size_t) bsize;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
404 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
405 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
406
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
407 ctx->buf = ngx_create_temp_buf(ctx->pool, size);
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
408 if (ctx->buf == NULL) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
409 return NGX_ERROR;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
410 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
411
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
412 /*
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
413 * we do not set ctx->buf->tag, because we do not want
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
414 * to reuse the buf via ctx->free list
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
415 */
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
416
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
417 #if (NGX_HAVE_ALIGNED_DIRECTIO)
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
418 ctx->unaligned = 1;
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
419 #endif
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
420
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
421 return NGX_OK;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
422 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
423
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
424
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
425 static ngx_int_t
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
426 ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
427 {
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
428 size_t size;
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
429 ngx_buf_t *b, *in;
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
430 ngx_uint_t recycled;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
431
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
432 in = ctx->in->buf;
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
433 size = ctx->bufs.size;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
434 recycled = 1;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
435
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
436 if (in->last_in_chain) {
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
437
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
438 if (bsize < (off_t) size) {
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
439
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
440 /*
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
441 * allocate a small temp buf for a small last buf
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
442 * or its small last part
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
443 */
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
444
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
445 size = (size_t) bsize;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
446 recycled = 0;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
447
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
448 } else if (!ctx->directio
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
449 && ctx->bufs.num == 1
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
450 && (bsize < (off_t) (size + size / 4)))
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
451 {
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
452 /*
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
453 * allocate a temp buf that equals to a last buf,
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
454 * if there is no directio, the last buf size is lesser
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
455 * than 1.25 of bufs.size and the temp buf is single
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
456 */
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
457
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
458 size = (size_t) bsize;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
459 recycled = 0;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
460 }
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
461 }
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
462
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
463 b = ngx_calloc_buf(ctx->pool);
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
464 if (b == NULL) {
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
465 return NGX_ERROR;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
466 }
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
467
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
468 if (ctx->directio) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
469
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
470 /*
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
471 * allocate block aligned to a disk sector size to enable
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
472 * userland buffer direct usage conjunctly with directio
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
473 */
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
474
3057
5ea5a90000d5 fix build by msvc, introduced in r3054
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
475 b->start = ngx_pmemalign(ctx->pool, size, (size_t) ctx->alignment);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
476 if (b->start == NULL) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
477 return NGX_ERROR;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
478 }
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
479
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
480 } else {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
481 b->start = ngx_palloc(ctx->pool, size);
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
482 if (b->start == NULL) {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
483 return NGX_ERROR;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
484 }
2230
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
485 }
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
486
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
487 b->pos = b->start;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
488 b->last = b->start;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
489 b->end = b->last + size;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
490 b->temporary = 1;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
491 b->tag = ctx->tag;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
492 b->recycled = recycled;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
493
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
494 ctx->buf = b;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
495 ctx->allocated++;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
496
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
497 return NGX_OK;
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
498 }
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
499
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
500
25cf039c40bd split ngx_output_chain()
Igor Sysoev <igor@sysoev.ru>
parents: 2180
diff changeset
501 static ngx_int_t
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
502 ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
504 off_t size;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
505 ssize_t n;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
506 ngx_buf_t *src, *dst;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
507 ngx_uint_t sendfile;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
508
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
509 src = ctx->in->buf;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
510 dst = ctx->buf;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511
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: 334
diff changeset
512 size = ngx_buf_size(src);
3515
76d252724db5 use ngx_min() and ngx_max()
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
513 size = ngx_min(size, dst->end - dst->pos);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
515 sendfile = ctx->sendfile & !ctx->directio;
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
516
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
517 #if (NGX_SENDFILE_LIMIT)
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
518
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
519 if (src->in_file && src->file_pos >= NGX_SENDFILE_LIMIT) {
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
520 sendfile = 0;
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
521 }
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
522
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
523 #endif
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
524
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: 334
diff changeset
525 if (ngx_buf_in_memory(src)) {
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
526 ngx_memcpy(dst->pos, src->pos, (size_t) size);
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
527 src->pos += (size_t) size;
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
528 dst->last += (size_t) size;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
530 if (src->in_file) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
531
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
532 if (sendfile) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
533 dst->in_file = 1;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
534 dst->file = src->file;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
535 dst->file_pos = src->file_pos;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
536 dst->file_last = src->file_pos + size;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
537
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
538 } else {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
539 dst->in_file = 0;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
540 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
541
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 src->file_pos += size;
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
543
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
544 } else {
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
545 dst->in_file = 0;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547
1227
3e40f3e4376c inherit flush flag, this fixes https proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1226
diff changeset
548 if (src->pos == src->last) {
3e40f3e4376c inherit flush flag, this fixes https proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1226
diff changeset
549 dst->flush = src->flush;
3e40f3e4376c inherit flush flag, this fixes https proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1226
diff changeset
550 dst->last_buf = src->last_buf;
2899
61d5b945730a fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents: 2316
diff changeset
551 dst->last_in_chain = src->last_in_chain;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554 } else {
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
555
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
556 #if (NGX_HAVE_ALIGNED_DIRECTIO)
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
557
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
558 if (ctx->unaligned) {
3164
b1b1775698d5 uniform ngx_directio_on/off() interface with other file functions
Igor Sysoev <igor@sysoev.ru>
parents: 3147
diff changeset
559 if (ngx_directio_off(src->file->fd) == NGX_FILE_ERROR) {
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
560 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
561 ngx_directio_off_n " \"%s\" failed",
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
562 src->file->name.data);
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
563 }
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
564 }
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
565
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
566 #endif
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
567
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
568 #if (NGX_HAVE_FILE_AIO)
3119
4c90c9129a82 fix case when the output filter should add incoming buffers
Igor Sysoev <igor@sysoev.ru>
parents: 3057
diff changeset
569 if (ctx->aio_handler) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
570 n = ngx_file_aio_read(src->file, dst->pos, (size_t) size,
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
571 src->file_pos, ctx->pool);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
572 if (n == NGX_AGAIN) {
3119
4c90c9129a82 fix case when the output filter should add incoming buffers
Igor Sysoev <igor@sysoev.ru>
parents: 3057
diff changeset
573 ctx->aio_handler(ctx, src->file);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
574 return NGX_AGAIN;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
575 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
576
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
577 } else
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
578 #endif
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
579 #if (NGX_THREADS)
6441
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
580 if (ctx->thread_handler) {
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
581 src->file->thread_task = ctx->thread_task;
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
582 src->file->thread_handler = ctx->thread_handler;
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
583 src->file->thread_ctx = ctx->filter_ctx;
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
584
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
585 n = ngx_thread_read(src->file, dst->pos, (size_t) size,
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
586 src->file_pos, ctx->pool);
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
587 if (n == NGX_AGAIN) {
6441
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6423
diff changeset
588 ctx->thread_task = src->file->thread_task;
6022
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
589 return NGX_AGAIN;
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
590 }
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
591
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
592 } else
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
593 #endif
1fdba317ee6d Added support for offloading read() in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 5980
diff changeset
594 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
595 n = ngx_read_file(src->file, dst->pos, (size_t) size,
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
596 src->file_pos);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
597 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 2910
diff changeset
598
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
599 #if (NGX_HAVE_ALIGNED_DIRECTIO)
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
600
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
601 if (ctx->unaligned) {
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
602 ngx_err_t err;
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
603
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
604 err = ngx_errno;
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
605
3164
b1b1775698d5 uniform ngx_directio_on/off() interface with other file functions
Igor Sysoev <igor@sysoev.ru>
parents: 3147
diff changeset
606 if (ngx_directio_on(src->file->fd) == NGX_FILE_ERROR) {
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
607 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
608 ngx_directio_on_n " \"%s\" failed",
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
609 src->file->name.data);
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
610 }
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
611
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
612 ngx_set_errno(err);
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
613
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
614 ctx->unaligned = 0;
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
615 }
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
616
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
617 #endif
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2245
diff changeset
618
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 if (n == NGX_ERROR) {
517
dadfa78d2270 nginx-0.1.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
620 return (ngx_int_t) n;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
623 if (n != size) {
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2230
diff changeset
624 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,
2245
8a98616abb73 add filename to the log message
Igor Sysoev <igor@sysoev.ru>
parents: 2240
diff changeset
625 ngx_read_file_n " read only %z of %O from \"%s\"",
8a98616abb73 add filename to the log message
Igor Sysoev <igor@sysoev.ru>
parents: 2240
diff changeset
626 n, size, src->file->name.data);
3147
cbb1add4a6fe fail if file size was changed
Igor Sysoev <igor@sysoev.ru>
parents: 3119
diff changeset
627 return NGX_ERROR;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 dst->last += n;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
632 if (sendfile) {
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
633 dst->in_file = 1;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
634 dst->file = src->file;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
635 dst->file_pos = src->file_pos;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
636 dst->file_last = src->file_pos + n;
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
637
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
638 } else {
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: 334
diff changeset
639 dst->in_file = 0;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
642 src->file_pos += n;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
643
1238
bb03410441d9 fix bug introduced in r1228
Igor Sysoev <igor@sysoev.ru>
parents: 1227
diff changeset
644 if (src->file_pos == src->file_last) {
1227
3e40f3e4376c inherit flush flag, this fixes https proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1226
diff changeset
645 dst->flush = src->flush;
3e40f3e4376c inherit flush flag, this fixes https proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1226
diff changeset
646 dst->last_buf = src->last_buf;
2899
61d5b945730a fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents: 2316
diff changeset
647 dst->last_in_chain = src->last_in_chain;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651 return NGX_OK;
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 }
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
653
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
654
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
655 ngx_int_t
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
656 ngx_chain_writer(void *data, ngx_chain_t *in)
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
657 {
166
389d7ee9fa60 nginx-0.0.1-2003-10-30-11:51:06 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
658 ngx_chain_writer_ctx_t *ctx = data;
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
659
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
660 off_t size;
6046
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
661 ngx_chain_t *cl, *ln, *chain;
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
662 ngx_connection_t *c;
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
663
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
664 c = ctx->connection;
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
665
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
666 for (size = 0; in; in = in->next) {
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
667
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
668 #if 1
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
669 if (ngx_buf_size(in->buf) == 0 && !ngx_buf_special(in->buf)) {
6045
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
670
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
671 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
672 "zero size buf in chain writer "
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
673 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
674 in->buf->temporary,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
675 in->buf->recycled,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
676 in->buf->in_file,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
677 in->buf->start,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
678 in->buf->pos,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
679 in->buf->last,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
680 in->buf->file,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
681 in->buf->file_pos,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
682 in->buf->file_last);
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
683
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
684 ngx_debug_point();
6045
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
685
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
686 continue;
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
687 }
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
688 #endif
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
689
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
690 size += ngx_buf_size(in->buf);
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 403
diff changeset
691
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
692 ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0,
1226
2b4fdc9640b7 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1215
diff changeset
693 "chain writer buf fl:%d s:%uO",
2b4fdc9640b7 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1215
diff changeset
694 in->buf->flush, ngx_buf_size(in->buf));
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 403
diff changeset
695
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
696 cl = ngx_alloc_chain_link(ctx->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
697 if (cl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
698 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
699 }
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
700
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
701 cl->buf = in->buf;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
702 cl->next = NULL;
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
703 *ctx->last = cl;
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
704 ctx->last = &cl->next;
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
705 }
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
706
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
707 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
708 "chain writer in: %p", ctx->out);
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 257
diff changeset
709
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
710 for (cl = ctx->out; cl; cl = cl->next) {
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
711
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
712 #if 1
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
713 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {
6045
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
714
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
715 ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
716 "zero size buf in chain writer "
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
717 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
718 cl->buf->temporary,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
719 cl->buf->recycled,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
720 cl->buf->in_file,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
721 cl->buf->start,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
722 cl->buf->pos,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
723 cl->buf->last,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
724 cl->buf->file,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
725 cl->buf->file_pos,
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
726 cl->buf->file_last);
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
727
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
728 ngx_debug_point();
6045
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
729
6ab301ddf469 Output chain: zero size buf alerts in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6022
diff changeset
730 continue;
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
731 }
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
732 #endif
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
733
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
734 size += ngx_buf_size(cl->buf);
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
735 }
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
736
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
737 if (size == 0 && !c->buffered) {
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
738 return NGX_OK;
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
739 }
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
740
6046
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
741 chain = c->send_chain(c, ctx->out, ctx->limit);
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
742
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
743 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
6046
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
744 "chain writer out: %p", chain);
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 257
diff changeset
745
6046
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
746 if (chain == NGX_CHAIN_ERROR) {
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
747 return NGX_ERROR;
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
748 }
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
749
6046
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
750 for (cl = ctx->out; cl && cl != chain; /* void */) {
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
751 ln = cl;
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
752 cl = cl->next;
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
753 ngx_free_chain(ctx->pool, ln);
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
754 }
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
755
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
756 ctx->out = chain;
66176dfea01e Output chain: free chain links in ngx_chain_writer().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6045
diff changeset
757
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
758 if (ctx->out == NULL) {
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
759 ctx->last = &ctx->out;
1211
9177da9e4add fix "proxy_pass https://"
Igor Sysoev <igor@sysoev.ru>
parents: 828
diff changeset
760
1962
3091e5d770a6 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1238
diff changeset
761 if (!c->buffered) {
1215
fb3ff245c96b an request body might not be passed to backend,
Igor Sysoev <igor@sysoev.ru>
parents: 1211
diff changeset
762 return NGX_OK;
fb3ff245c96b an request body might not be passed to backend,
Igor Sysoev <igor@sysoev.ru>
parents: 1211
diff changeset
763 }
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
764 }
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
765
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
766 return NGX_AGAIN;
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
767 }