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