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