Mercurial > hg > nginx-ranges
comparison src/os/unix/ngx_darwin_sendfile_chain.c @ 531:d41628eb4d0a NGINX_0_8_12
nginx 0.8.12
*) Feature: the "sendfile" parameter in the "aio" directive on FreeBSD.
*) Bugfix: in try_files; the bug had appeared in 0.8.11.
*) Bugfix: in memcached; the bug had appeared in 0.8.11.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 31 Aug 2009 00:00:00 +0400 |
parents | 0b6053502c55 |
children |
comparison
equal
deleted
inserted
replaced
530:1fd1b769cd78 | 531:d41628eb4d0a |
---|---|
40 { | 40 { |
41 int rc; | 41 int rc; |
42 u_char *prev; | 42 u_char *prev; |
43 off_t size, send, prev_send, aligned, sent, fprev; | 43 off_t size, send, prev_send, aligned, sent, fprev; |
44 off_t header_size, file_size; | 44 off_t header_size, file_size; |
45 ngx_uint_t eintr, eagain, complete; | 45 ngx_uint_t eintr, complete; |
46 ngx_err_t err; | 46 ngx_err_t err; |
47 ngx_buf_t *file; | 47 ngx_buf_t *file; |
48 ngx_array_t header, trailer; | 48 ngx_array_t header, trailer; |
49 ngx_event_t *wev; | 49 ngx_event_t *wev; |
50 ngx_chain_t *cl; | 50 ngx_chain_t *cl; |
73 if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { | 73 if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { |
74 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; | 74 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; |
75 } | 75 } |
76 | 76 |
77 send = 0; | 77 send = 0; |
78 eagain = 0; | |
79 | 78 |
80 header.elts = headers; | 79 header.elts = headers; |
81 header.size = sizeof(struct iovec); | 80 header.size = sizeof(struct iovec); |
82 header.nalloc = NGX_HEADERS; | 81 header.nalloc = NGX_HEADERS; |
83 header.pool = c->pool; | 82 header.pool = c->pool; |
236 &sent, &hdtr, 0); | 235 &sent, &hdtr, 0); |
237 | 236 |
238 if (rc == -1) { | 237 if (rc == -1) { |
239 err = ngx_errno; | 238 err = ngx_errno; |
240 | 239 |
241 if (err == NGX_EAGAIN || err == NGX_EINTR) { | 240 switch (err) { |
242 if (err == NGX_EINTR) { | 241 case NGX_EAGAIN: |
243 eintr = 1; | 242 break; |
244 | 243 |
245 } else { | 244 case NGX_EINTR: |
246 eagain = 1; | 245 eintr = 1; |
247 } | 246 break; |
248 | 247 |
249 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, | 248 default: |
250 "sendfile() sent only %O bytes", sent); | |
251 | |
252 } else { | |
253 wev->error = 1; | 249 wev->error = 1; |
254 (void) ngx_connection_error(c, err, "sendfile() failed"); | 250 (void) ngx_connection_error(c, err, "sendfile() failed"); |
255 return NGX_CHAIN_ERROR; | 251 return NGX_CHAIN_ERROR; |
256 } | 252 } |
253 | |
254 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, | |
255 "sendfile() sent only %O bytes", sent); | |
257 } | 256 } |
258 | 257 |
259 if (rc == 0 && sent == 0) { | 258 if (rc == 0 && sent == 0) { |
260 | 259 |
261 /* | 260 /* |
282 "writev: %d of %uz", rc, send); | 281 "writev: %d of %uz", rc, send); |
283 | 282 |
284 if (rc == -1) { | 283 if (rc == -1) { |
285 err = ngx_errno; | 284 err = ngx_errno; |
286 | 285 |
287 if (err == NGX_EAGAIN || err == NGX_EINTR) { | 286 switch (err) { |
288 if (err == NGX_EINTR) { | 287 case NGX_EAGAIN: |
289 eintr = 1; | 288 break; |
290 } | 289 |
291 | 290 case NGX_EINTR: |
292 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, | 291 eintr = 1; |
293 "writev() not ready"); | 292 break; |
294 | 293 |
295 } else { | 294 default: |
296 wev->error = 1; | 295 wev->error = 1; |
297 ngx_connection_error(c, err, "writev() failed"); | 296 ngx_connection_error(c, err, "writev() failed"); |
298 return NGX_CHAIN_ERROR; | 297 return NGX_CHAIN_ERROR; |
299 } | 298 } |
299 | |
300 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, | |
301 "writev() not ready"); | |
300 } | 302 } |
301 | 303 |
302 sent = rc > 0 ? rc : 0; | 304 sent = rc > 0 ? rc : 0; |
303 } | 305 } |
304 | 306 |