Mercurial > hg > nginx
comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 3065:113cd532b328
aio sendfile
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 30 Aug 2009 09:52:39 +0000 |
parents | 6f6d7ea70805 |
children | af427e13cfd7 |
comparison
equal
deleted
inserted
replaced
3064:23e6f26fb4bd | 3065:113cd532b328 |
---|---|
38 | 38 |
39 | 39 |
40 ngx_chain_t * | 40 ngx_chain_t * |
41 ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) | 41 ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) |
42 { | 42 { |
43 int rc; | 43 int rc, flags; |
44 u_char *prev; | 44 u_char *prev; |
45 off_t size, send, prev_send, aligned, sent, fprev; | 45 off_t size, send, prev_send, aligned, sent, fprev; |
46 size_t header_size, file_size; | 46 size_t header_size, file_size; |
47 ngx_uint_t eintr, eagain, complete; | 47 ngx_uint_t eintr, eagain, complete; |
48 ngx_err_t err; | 48 ngx_err_t err; |
76 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; | 76 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; |
77 } | 77 } |
78 | 78 |
79 send = 0; | 79 send = 0; |
80 eagain = 0; | 80 eagain = 0; |
81 flags = 0; | |
81 | 82 |
82 header.elts = headers; | 83 header.elts = headers; |
83 header.size = sizeof(struct iovec); | 84 header.size = sizeof(struct iovec); |
84 header.nalloc = NGX_HEADERS; | 85 header.nalloc = NGX_HEADERS; |
85 header.pool = c->pool; | 86 header.pool = c->pool; |
259 header_size = 0; | 260 header_size = 0; |
260 } | 261 } |
261 | 262 |
262 sent = 0; | 263 sent = 0; |
263 | 264 |
265 #if (NGX_HAVE_AIO_SENDFILE) | |
266 flags = c->aio_sendfile ? SF_NODISKIO : 0; | |
267 #endif | |
268 | |
264 rc = sendfile(file->file->fd, c->fd, file->file_pos, | 269 rc = sendfile(file->file->fd, c->fd, file->file_pos, |
265 file_size + header_size, &hdtr, &sent, 0); | 270 file_size + header_size, &hdtr, &sent, flags); |
266 | 271 |
267 if (rc == -1) { | 272 if (rc == -1) { |
268 err = ngx_errno; | 273 err = ngx_errno; |
269 | 274 |
270 switch (err) { | 275 switch (err) { |
273 break; | 278 break; |
274 | 279 |
275 case NGX_EINTR: | 280 case NGX_EINTR: |
276 eintr = 1; | 281 eintr = 1; |
277 break; | 282 break; |
283 | |
284 #if (NGX_HAVE_AIO_SENDFILE) | |
285 case NGX_EBUSY: | |
286 c->busy_sendfile = file; | |
287 break; | |
288 #endif | |
278 | 289 |
279 default: | 290 default: |
280 wev->error = 1; | 291 wev->error = 1; |
281 (void) ngx_connection_error(c, err, "sendfile() failed"); | 292 (void) ngx_connection_error(c, err, "sendfile() failed"); |
282 return NGX_CHAIN_ERROR; | 293 return NGX_CHAIN_ERROR; |
380 cl->buf->file_pos += sent; | 391 cl->buf->file_pos += sent; |
381 } | 392 } |
382 | 393 |
383 break; | 394 break; |
384 } | 395 } |
396 | |
397 #if (NGX_HAVE_AIO_SENDFILE) | |
398 if (c->busy_sendfile) { | |
399 return cl; | |
400 } | |
401 #endif | |
385 | 402 |
386 if (eagain) { | 403 if (eagain) { |
387 | 404 |
388 /* | 405 /* |
389 * sendfile() may return EAGAIN, even if it has sent a whole file | 406 * sendfile() may return EAGAIN, even if it has sent a whole file |