annotate src/os/unix/ngx_freebsd_sendfile_chain.c @ 154:eac26585476e

nginx-0.0.1-2003-10-22-11:05:29 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 22 Oct 2003 07:05:29 +0000
parents c71aeb75c071
children 46eb23d9471d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 #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
3 #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
4 #include <ngx_event.h>
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
5 #include <ngx_freebsd_init.h>
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
7
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
8 /*
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
9 * sendfile() often sends 4K pages over ethernet in 3 packets: 2x1460 and 1176
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
10 * or in 6 packets: 5x1460 and 892. Besides although sendfile() allows
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
11 * to pass the header and the trailer it never sends the header or the trailer
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
12 * with the part of the file in one packet. So we use TCP_NOPUSH (similar
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
13 * to Linux's TCP_CORK) to postpone the sending - it not only sends the header
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
14 * and the first part of the file in one packet but also sends 4K pages
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
15 * in the full packets.
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
16 *
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
17 * Until FreeBSD 4.5 the turning TCP_NOPUSH off does not flush the pending
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
18 * data that less than MSS so the data can be sent with 5 second delay.
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
19 * We do not use TCP_NOPUSH on FreeBSD prior to 4.5 although it can be used
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
20 * 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
21 */
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
94
8220378432a8 nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
24 ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in)
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 {
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
26 int rc, eintr, eagain;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 char *prev;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
28 ssize_t hsize, fsize, size;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
29 off_t sent, fprev;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 struct iovec *iov;
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 struct sf_hdtr hdtr;
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_err_t err;
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 ngx_array_t header, trailer;
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 ngx_hunk_t *file;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
35 ngx_chain_t *ce, *tail;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
36
144
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
37 if (!c->write->ready) {
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
38 return in;
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
39 }
ef8c87afcfc5 nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 143
diff changeset
40
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
41 do {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
42 ce = in;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
43 file = NULL;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
44 fsize = 0;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
45 hsize = 0;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
46 eintr = 0;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
47 eagain = 0;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
48
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
49 ngx_init_array(header, c->pool, 10, sizeof(struct iovec),
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
50 NGX_CHAIN_ERROR);
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
51 ngx_init_array(trailer, c->pool, 10, sizeof(struct iovec),
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
52 NGX_CHAIN_ERROR);
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
53
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
54 /* create the iovec and coalesce the neighbouring chain entries */
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
55
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
56 prev = NULL;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
57 iov = NULL;
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
58
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
59 for (ce = in; ce; ce = ce->next) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
60 if (ngx_hunk_special(ce->hunk)) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
61 continue;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
62 }
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
63
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
64 if (!ngx_hunk_in_memory_only(ce->hunk)) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
65 break;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
66 }
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
67
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
68 if (prev == ce->hunk->pos) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
69 iov->iov_len += ce->hunk->last - ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
70 prev = ce->hunk->last;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
71
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
72 } else {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
73 ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR);
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
74 iov->iov_base = ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
75 iov->iov_len = ce->hunk->last - ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
76 prev = ce->hunk->last;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
77 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
79 hsize += ce->hunk->last - ce->hunk->pos;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
80 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
81
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
82 /* get the file hunk */
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
83
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
84 if (ce && (ce->hunk->type & NGX_HUNK_FILE)) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
85 file = ce->hunk;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
86 fsize = (size_t) (file->file_last - file->file_pos);
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
87 fprev = file->file_last;
154
eac26585476e nginx-0.0.1-2003-10-22-11:05:29 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
88 ce = ce->next;
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
89
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
90 /* coalesce the neighbouring file hunks */
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
91
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
92 while (ce && (ce->hunk->type & NGX_HUNK_FILE)) {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
93 if (file->file->fd != ce->hunk->file->fd
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
94 || fprev != ce->hunk->file_pos)
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
95 {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
96 break;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
97 }
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
98
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
99 fsize += (size_t) (ce->hunk->file_last - ce->hunk->file_pos);
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
100 fprev = ce->hunk->file_last;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
101 ce = ce->next;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
102 }
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
103 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
105 /* create the iovec and coalesce the neighbouring chain entries */
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
106
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
107 prev = NULL;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
108 iov = NULL;
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
109
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
110 for ( /* void */; ce; ce = ce->next) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
111 if (ngx_hunk_special(ce->hunk)) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
112 continue;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
113 }
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
114
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
115 if (!ngx_hunk_in_memory_only(ce->hunk)) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
116 break;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
117 }
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
118
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
119 if (prev == ce->hunk->pos) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
120 iov->iov_len += ce->hunk->last - ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
121 prev = ce->hunk->last;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
123 } else {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
124 ngx_test_null(iov, ngx_push_array(&trailer), NGX_CHAIN_ERROR);
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
125 iov->iov_base = ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
126 iov->iov_len = ce->hunk->last - ce->hunk->pos;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
127 prev = ce->hunk->last;
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
128 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
129 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 63
diff changeset
130
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
131 /*
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
132 * the tail is the rest of the chain that exceeded
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
133 * a single sendfile() capability
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
134 */
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
135
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
136 tail = ce;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
137
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
138 if (file) {
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
140 if (ngx_freebsd_use_tcp_nopush && !c->tcp_nopush) {
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
141 c->tcp_nopush = 1;
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
142
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
143 ngx_log_debug(c->log, "NOPUSH");
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
144
101
2e069b6e6920 nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 99
diff changeset
145 if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {
2e069b6e6920 nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 99
diff changeset
146 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
2e069b6e6920 nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 99
diff changeset
147 ngx_tcp_nopush_n " failed");
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
148 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
149 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
150 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
151
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
152 hdtr.headers = (struct iovec *) header.elts;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
153 hdtr.hdr_cnt = header.nelts;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
154 hdtr.trailers = (struct iovec *) trailer.elts;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
155 hdtr.trl_cnt = trailer.nelts;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
156
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
157 /*
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
158 * the old sendfile() "nbytes bug":
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
159 * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
160 */
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
161
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
162 if (ngx_freebsd_sendfile_nbytes_bug == 0) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
163 hsize = 0;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
166 rc = sendfile(file->file->fd, c->fd, file->file_pos,
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
167 fsize + hsize, &hdtr, &sent, 0);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
168
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
169 if (rc == -1) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
170 err = ngx_errno;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
171
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
172 if (err == NGX_EINTR) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
173 eintr = 1;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
174 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
175
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
176 if (err == NGX_EAGAIN) {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
177 eagain = 1;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
178 }
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
179
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
180 if (err == NGX_EAGAIN || err == NGX_EINTR) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
181 ngx_log_error(NGX_LOG_INFO, c->log, err,
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
182 "sendfile() sent only %qd bytes", sent);
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
183
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
184 } else {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
185 ngx_log_error(NGX_LOG_CRIT, c->log, err,
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
186 "sendfile() failed");
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
187 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
188 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
189 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
190
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
191 #if (NGX_DEBUG_WRITE_CHAIN)
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
192 ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
193 rc _ file->file_pos _ sent _ fsize + hsize);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
194 #endif
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
195
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
196 } else {
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
197 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
198
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
199 if (rc == -1) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
200 err = ngx_errno;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
201 if (err == NGX_EAGAIN) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
203
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
204 } else if (err == NGX_EINTR) {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
205 eintr = 1;
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
207
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
208 } else {
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
209 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed");
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
210 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
211 }
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
212 }
89
29bf798b583f nginx-0.0.1-2003-05-15-19:42:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 88
diff changeset
213
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
214 sent = rc > 0 ? rc : 0;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
216 #if (NGX_DEBUG_WRITE_CHAIN)
143
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
217 ngx_log_debug(c->log, "writev: %qd" _ sent);
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
218 #endif
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
219 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
221 c->sent += sent;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
223 for (ce = in; ce; ce = ce->next) {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
224
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
225 if (ngx_hunk_special(ce->hunk)) {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
226 continue;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
227 }
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
229 if (sent == 0) {
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
230 break;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 }
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
233 size = ngx_hunk_size(ce->hunk);
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
234
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
235 if (sent >= size) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
236 sent -= size;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
237
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
238 if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
239 ce->hunk->pos = ce->hunk->last;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
240 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
241
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
242 if (ce->hunk->type & NGX_HUNK_FILE) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
243 ce->hunk->file_pos = ce->hunk->file_last;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
244 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
245
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
246 continue;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
247 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
248
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
249 if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
250 ce->hunk->pos += sent;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
251 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
252
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
253 if (ce->hunk->type & NGX_HUNK_FILE) {
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
254 ce->hunk->file_pos += sent;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
255 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
256
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
257 break;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
258 }
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
259
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
260 in = ce;
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
261
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
262 if (eagain) {
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
263 /*
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
264 * sendfile() can return EAGAIN even if it has sent
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
265 * a whole file part and successive sendfile() would
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
266 * return EAGAIN right away and would not send anything.
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 152
diff changeset
267 */
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
268 c->write->ready = 0;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
269 break;
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
270 }
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 94
diff changeset
271
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
272 /* "tail == in" means that a single sendfile() is complete */
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
273
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
274 } while ((tail && tail == in) || eintr);
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
275
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
276 if (in) {
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
277 c->write->ready = 0;
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
278 }
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 103
diff changeset
279
152
fb48bf4fea1c nginx-0.0.1-2003-10-21-11:47:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
280 return in;
63
36d2c25cc9bb nginx-0.0.1-2003-02-26-23:21:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 }