Mercurial > hg > nginx
comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 153:c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 21 Oct 2003 16:49:56 +0000 |
parents | fb48bf4fea1c |
children | eac26585476e |
comparison
equal
deleted
inserted
replaced
152:fb48bf4fea1c | 153:c71aeb75c071 |
---|---|
152 hdtr.headers = (struct iovec *) header.elts; | 152 hdtr.headers = (struct iovec *) header.elts; |
153 hdtr.hdr_cnt = header.nelts; | 153 hdtr.hdr_cnt = header.nelts; |
154 hdtr.trailers = (struct iovec *) trailer.elts; | 154 hdtr.trailers = (struct iovec *) trailer.elts; |
155 hdtr.trl_cnt = trailer.nelts; | 155 hdtr.trl_cnt = trailer.nelts; |
156 | 156 |
157 /* | |
158 * the old sendfile() "nbytes bug": | |
159 * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771 | |
160 */ | |
161 | |
157 if (ngx_freebsd_sendfile_nbytes_bug == 0) { | 162 if (ngx_freebsd_sendfile_nbytes_bug == 0) { |
158 hsize = 0; | 163 hsize = 0; |
159 } | 164 } |
160 | 165 |
161 rc = sendfile(file->file->fd, c->fd, file->file_pos, | 166 rc = sendfile(file->file->fd, c->fd, file->file_pos, |
192 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts); | 197 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts); |
193 | 198 |
194 if (rc == -1) { | 199 if (rc == -1) { |
195 err = ngx_errno; | 200 err = ngx_errno; |
196 if (err == NGX_EAGAIN) { | 201 if (err == NGX_EAGAIN) { |
197 eagain = 1; | |
198 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); | 202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); |
199 | 203 |
200 } else if (err == NGX_EINTR) { | 204 } else if (err == NGX_EINTR) { |
201 eintr = 1; | 205 eintr = 1; |
202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); | 206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); |
254 } | 258 } |
255 | 259 |
256 in = ce; | 260 in = ce; |
257 | 261 |
258 if (eagain) { | 262 if (eagain) { |
263 /* | |
264 * sendfile() can return EAGAIN even if it has sent | |
265 * a whole file part and successive sendfile() would | |
266 * return EAGAIN right away and would not send anything. | |
267 */ | |
259 c->write->ready = 0; | 268 c->write->ready = 0; |
260 break; | 269 break; |
261 } | 270 } |
262 | 271 |
263 /* "tail == in" means that a single sendfile() is complete */ | 272 /* "tail == in" means that a single sendfile() is complete */ |