annotate src/os/unix/ngx_freebsd_sendfile_chain.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents b002ad258f1d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
272
d4e65d74db9f nginx-0.0.2-2004-03-01-00:03:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
1
d4e65d74db9f nginx-0.0.2-2004-03-01-00:03:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 265
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: 4335
diff changeset
4 * Copyright (C) Nginx, Inc.
272
d4e65d74db9f nginx-0.0.2-2004-03-01-00:03:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
5 */
d4e65d74db9f nginx-0.0.2-2004-03-01-00:03:02 import
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
6
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
9 #include <ngx_core.h>
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
10 #include <ngx_event.h>
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
12
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
13 /*
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
14 * Although FreeBSD sendfile() allows to pass a header and a trailer,
4133
59b99f217c6d Replaced "can not" with "cannot" and "could not" in a bunch of places.
Ruslan Ermilov <ru@nginx.com>
parents: 3081
diff changeset
15 * it cannot send a header with a part of the file in one packet until
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
16 * FreeBSD 5.3. Besides, over the fast ethernet connection sendfile()
361
446782c909b3 nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
17 * may send the partially filled packets, i.e. the 8 file pages may be sent
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 272
diff changeset
18 * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet,
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 272
diff changeset
19 * and then again the 11 full 1460-bytes packets.
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
20 *
4572
67653855682e Fixed spelling in multiline C comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4499
diff changeset
21 * Therefore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
22 * to postpone the sending - it not only sends a header and the first part of
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
23 * the file in one packet, but also sends the file pages in the full packets.
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
24 *
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
25 * But until FreeBSD 4.5 turning TCP_NOPUSH off does not flush a pending
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
26 * data that less than MSS, so that data may be sent with 5 second delay.
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
27 * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5, although it can be used
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
28 * for non-keepalive HTTP connections.
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
29 */
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
32 ngx_chain_t *
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
33 ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 {
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
35 int rc, flags;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
36 off_t send, prev_send, sent;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
37 size_t file_size;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
38 ssize_t n;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
39 ngx_err_t err;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
40 ngx_buf_t *file;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
41 ngx_uint_t eintr, eagain;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
42 #if (NGX_HAVE_SENDFILE_NODISKIO)
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
43 ngx_uint_t ebusy;
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
44 #endif
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
45 ngx_event_t *wev;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
46 ngx_chain_t *cl;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
47 ngx_iovec_t header, trailer;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
48 struct sf_hdtr hdtr;
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
49 struct iovec headers[NGX_IOVS_PREALLOCATE];
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
50 struct iovec trailers[NGX_IOVS_PREALLOCATE];
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
51
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
52 wev = c->write;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
53
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
54 if (!wev->ready) {
144
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
55 return in;
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
56 }
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
57
469
2ff194b74f1e nginx-0.1.9-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
58 #if (NGX_HAVE_KQUEUE)
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
59
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
60 if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
61 (void) ngx_connection_error(c, wev->kq_errno,
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
62 "kevent() reported about an closed connection");
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
63 wev->error = 1;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
64 return NGX_CHAIN_ERROR;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
65 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
66
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
67 #endif
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
68
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
69 /* the maximum limit size is the maximum size_t value - the page size */
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
70
1354
f69d1aab6a0f make 64-bit ngx_int_t on 64-bit platforms
Igor Sysoev <igor@sysoev.ru>
parents: 1182
diff changeset
71 if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
72 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
73 }
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
74
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
75 send = 0;
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
76 eagain = 0;
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
77 flags = 0;
361
446782c909b3 nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
78
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
79 header.iovs = headers;
5854
b63e829621ab Generalized definitions of the number of preallocated iovec's.
Valentin Bartenev <vbart@nginx.com>
parents: 5851
diff changeset
80 header.nalloc = NGX_IOVS_PREALLOCATE;
428
5e73d0ea4dab nginx-0.0.11-2004-09-16-20:10:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
81
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
82 trailer.iovs = trailers;
5854
b63e829621ab Generalized definitions of the number of preallocated iovec's.
Valentin Bartenev <vbart@nginx.com>
parents: 5851
diff changeset
83 trailer.nalloc = NGX_IOVS_PREALLOCATE;
428
5e73d0ea4dab nginx-0.0.11-2004-09-16-20:10:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
84
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
85 for ( ;; ) {
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
86 eintr = 0;
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
87 #if (NGX_HAVE_SENDFILE_NODISKIO)
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
88 ebusy = 0;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
89 #endif
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
90 prev_send = send;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
91
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: 297
diff changeset
92 /* create the header iovec and coalesce the neighbouring bufs */
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
93
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
94 cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);
361
446782c909b3 nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
95
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
96 if (cl == NGX_CHAIN_ERROR) {
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
97 return NGX_CHAIN_ERROR;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
98 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
99
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
100 send += header.size;
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
101
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
102 if (cl && cl->buf->in_file && send < limit) {
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: 297
diff changeset
103 file = cl->buf;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
104
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
105 /* coalesce the neighbouring file bufs */
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
106
5915
ac3f78219f85 Moved the code for coalescing file buffers to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5913
diff changeset
107 file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
108
5915
ac3f78219f85 Moved the code for coalescing file buffers to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5913
diff changeset
109 send += file_size;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
110
6874
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
111 if (send < limit) {
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
112
6874
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
113 /*
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
114 * create the trailer iovec and coalesce the neighbouring bufs
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
115 */
361
446782c909b3 nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
116
6874
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
117 cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send,
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
118 c->log);
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
119 if (cl == NGX_CHAIN_ERROR) {
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
120 return NGX_CHAIN_ERROR;
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
121 }
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
122
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
123 send += trailer.size;
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
124
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
125 } else {
7cc2d3a96ea3 Fixed trailer construction with limit on FreeBSD and macOS.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6422
diff changeset
126 trailer.count = 0;
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
127 }
4596
089cc5154c1e IOV_MAX handling microoptimization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
128
344
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
129 if (ngx_freebsd_use_tcp_nopush
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
130 && c->tcp_nopush == NGX_TCP_NOPUSH_UNSET)
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
131 {
7239
400a3412b1e3 Fixed checking ngx_tcp_push() and ngx_tcp_nopush() return values.
Ruslan Ermilov <ru@nginx.com>
parents: 6874
diff changeset
132 if (ngx_tcp_nopush(c->fd) == -1) {
5557
188481078faf Use ngx_socket_errno where appropriate.
Piotr Sikora <piotr@cloudflare.com>
parents: 5320
diff changeset
133 err = ngx_socket_errno;
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
134
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
135 /*
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
136 * there is a tiny chance to be interrupted, however,
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
137 * we continue a processing without the TCP_NOPUSH
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
138 */
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
139
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
140 if (err != NGX_EINTR) {
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
141 wev->error = 1;
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
142 (void) ngx_connection_error(c, err,
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
143 ngx_tcp_nopush_n " failed");
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
144 return NGX_CHAIN_ERROR;
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
145 }
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
146
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
147 } else {
344
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
148 c->tcp_nopush = NGX_TCP_NOPUSH_SET;
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
149
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
150 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
151 "tcp_nopush");
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
152 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
153 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
154
4335
1003326eccc5 Microoptimization of sendfile(2) usage under FreeBSD.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
155 /*
1003326eccc5 Microoptimization of sendfile(2) usage under FreeBSD.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
156 * sendfile() does unneeded work if sf_hdtr's count is 0,
1003326eccc5 Microoptimization of sendfile(2) usage under FreeBSD.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
157 * but corresponding pointer is not NULL
1003326eccc5 Microoptimization of sendfile(2) usage under FreeBSD.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
158 */
1003326eccc5 Microoptimization of sendfile(2) usage under FreeBSD.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
159
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
160 hdtr.headers = header.count ? header.iovs : NULL;
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
161 hdtr.hdr_cnt = header.count;
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
162 hdtr.trailers = trailer.count ? trailer.iovs : NULL;
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
163 hdtr.trl_cnt = trailer.count;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
164
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
165 /*
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 154
diff changeset
166 * the "nbytes bug" of the old sendfile() syscall:
5727
675bda8dcfdb FreeBSD has migrated to Bugzilla.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5557
diff changeset
167 * http://bugs.freebsd.org/33771
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
168 */
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
169
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
170 if (!ngx_freebsd_sendfile_nbytes_bug) {
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
171 header.size = 0;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 }
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
203
c9da5900c79e nginx-0.0.1-2003-12-02-08:47:29 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
174 sent = 0;
c9da5900c79e nginx-0.0.1-2003-12-02-08:47:29 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
175
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
176 #if (NGX_HAVE_SENDFILE_NODISKIO)
7987
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
177
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
178 flags = (c->busy_count <= 2) ? SF_NODISKIO : 0;
7987
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
179
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
180 if (file->file->directio) {
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
181 flags |= SF_NOCACHE;
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
182 }
b002ad258f1d Support for sendfile(SF_NOCACHE).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7985
diff changeset
183
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
184 #endif
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
185
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
186 rc = sendfile(file->file->fd, c->fd, file->file_pos,
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
187 file_size + header.size, &hdtr, &sent, flags);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
188
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
189 if (rc == -1) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
190 err = ngx_errno;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
191
3063
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
192 switch (err) {
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
193 case NGX_EAGAIN:
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
194 eagain = 1;
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
195 break;
216
f1d0e5f09c1e nginx-0.0.1-2003-12-25-23:26:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 214
diff changeset
196
3063
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
197 case NGX_EINTR:
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
198 eintr = 1;
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
199 break;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
200
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
201 #if (NGX_HAVE_SENDFILE_NODISKIO)
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
202 case NGX_EBUSY:
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
203 ebusy = 1;
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
204 break;
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
205 #endif
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
206
3063
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
207 default:
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
208 wev->error = 1;
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
209 (void) ngx_connection_error(c, err, "sendfile() failed");
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
210 return NGX_CHAIN_ERROR;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
211 }
3063
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
212
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
213 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,
6f6d7ea70805 refactor EAGAIN/EINTR processing
Igor Sysoev <igor@sysoev.ru>
parents: 1354
diff changeset
214 "sendfile() sent only %O bytes", sent);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
215
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
216 /*
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
217 * sendfile() in FreeBSD 3.x-4.x may return value >= 0
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
218 * on success, although only 0 is documented
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
219 */
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
220
3080
af427e13cfd7 small optimization
Igor Sysoev <igor@sysoev.ru>
parents: 3065
diff changeset
221 } else if (rc >= 0 && sent == 0) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
222
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
223 /*
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
224 * if rc is OK and sent equal to zero, then someone
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
225 * has truncated the file, so the offset became beyond
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
226 * the end of the file
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
227 */
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
228
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
229 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
3081
10bfdd8d5eb9 log offset passed to sendfile()
Igor Sysoev <igor@sysoev.ru>
parents: 3080
diff changeset
230 "sendfile() reported that \"%s\" was truncated at %O",
10bfdd8d5eb9 log offset passed to sendfile()
Igor Sysoev <igor@sysoev.ru>
parents: 3080
diff changeset
231 file->file->name.data, file->file_pos);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
232
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
233 return NGX_CHAIN_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
234 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
235
214
e0c502f15852 nginx-0.0.1-2003-12-22-12:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 203
diff changeset
236 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
237 "sendfile: %d, @%O %O:%uz",
5913
8e903522c17a Introduced the ngx_output_chain_to_iovec() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5912
diff changeset
238 rc, file->file_pos, sent, file_size + header.size);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
239
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
240 } else {
5917
2c64b69daec5 Moved writev() handling code to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5916
diff changeset
241 n = ngx_writev(c, &header);
216
f1d0e5f09c1e nginx-0.0.1-2003-12-25-23:26:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 214
diff changeset
242
5917
2c64b69daec5 Moved writev() handling code to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5916
diff changeset
243 if (n == NGX_ERROR) {
2c64b69daec5 Moved writev() handling code to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5916
diff changeset
244 return NGX_CHAIN_ERROR;
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
245 }
89
29bf798b583f nginx-0.0.1-2003-05-15-19:42:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 88
diff changeset
246
5917
2c64b69daec5 Moved writev() handling code to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 5916
diff changeset
247 sent = (n == NGX_AGAIN) ? 0 : n;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
248 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
250 c->sent += sent;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
5912
de68ed551bfb Renamed ngx_handle_sent_chain() to ngx_chain_update_sent().
Valentin Bartenev <vbart@nginx.com>
parents: 5868
diff changeset
252 in = ngx_chain_update_sent(in, sent);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
253
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
254 #if (NGX_HAVE_SENDFILE_NODISKIO)
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
255
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
256 if (ebusy) {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
257 if (sent == 0) {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
258 c->busy_count++;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
259
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
260 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
261 "sendfile() busy, count:%d", c->busy_count);
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
262
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
263 } else {
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
264 c->busy_count = 0;
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
265 }
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
266
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
267 if (wev->posted) {
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
268 ngx_delete_posted_event(wev);
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
269 }
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
270
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
271 ngx_post_event(wev, &ngx_posted_next_events);
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
272
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
273 wev->ready = 0;
5320
ad137a80919f Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
Gleb Smirnoff <glebius@nginx.com>
parents: 4596
diff changeset
274 return in;
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
275 }
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
276
7985
ec2e6893caaa Simplified sendfile(SF_NODISKIO) usage.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7974
diff changeset
277 c->busy_count = 0;
5980
ccad84a174e0 Refactored sendfile() AIO preload.
Valentin Bartenev <vbart@nginx.com>
parents: 5917
diff changeset
278
3065
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
279 #endif
113cd532b328 aio sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 3063
diff changeset
280
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
281 if (eagain) {
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 154
diff changeset
282
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
283 /*
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
284 * sendfile() may return EAGAIN, even if it has sent a whole file
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
285 * part, it indicates that the successive sendfile() call would
253
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
286 * return EAGAIN right away and would not send anything.
b6793bc5034b nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 218
diff changeset
287 * We use it as a hint.
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
288 */
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 154
diff changeset
289
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 163
diff changeset
290 wev->ready = 0;
5320
ad137a80919f Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
Gleb Smirnoff <glebius@nginx.com>
parents: 4596
diff changeset
291 return in;
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
292 }
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
293
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
294 if (eintr) {
5868
6bbad2e73245 Fixed counting of sent bytes in the send chain functions on EINTR.
Valentin Bartenev <vbart@nginx.com>
parents: 5854
diff changeset
295 send = prev_send + sent;
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
296 continue;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
297 }
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
298
5851
150df089fe47 Removed the "complete" variable from various send chain functions.
Valentin Bartenev <vbart@nginx.com>
parents: 5850
diff changeset
299 if (send - prev_send != sent) {
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
300 wev->ready = 0;
5320
ad137a80919f Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
Gleb Smirnoff <glebius@nginx.com>
parents: 4596
diff changeset
301 return in;
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
302 }
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
303
5320
ad137a80919f Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
Gleb Smirnoff <glebius@nginx.com>
parents: 4596
diff changeset
304 if (send >= limit || in == NULL) {
ad137a80919f Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
Gleb Smirnoff <glebius@nginx.com>
parents: 4596
diff changeset
305 return in;
362
7650aea1816f nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 361
diff changeset
306 }
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
307 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 }