refactor EAGAIN/EINTR processing

This commit is contained in:
Igor Sysoev 2009-08-30 09:42:29 +00:00
parent d11fa717f0
commit 8c491a77bc
5 changed files with 82 additions and 64 deletions

View File

@ -42,7 +42,7 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
u_char *prev; u_char *prev;
off_t size, send, prev_send, aligned, sent, fprev; off_t size, send, prev_send, aligned, sent, fprev;
off_t header_size, file_size; off_t header_size, file_size;
ngx_uint_t eintr, eagain, complete; ngx_uint_t eintr, complete;
ngx_err_t err; ngx_err_t err;
ngx_buf_t *file; ngx_buf_t *file;
ngx_array_t header, trailer; ngx_array_t header, trailer;
@ -75,7 +75,6 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
} }
send = 0; send = 0;
eagain = 0;
header.elts = headers; header.elts = headers;
header.size = sizeof(struct iovec); header.size = sizeof(struct iovec);
@ -238,22 +237,22 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
} else { case NGX_EINTR:
eagain = 1; eintr = 1;
} break;
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, default:
"sendfile() sent only %O bytes", sent);
} else {
wev->error = 1; wev->error = 1;
(void) ngx_connection_error(c, err, "sendfile() failed"); (void) ngx_connection_error(c, err, "sendfile() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,
"sendfile() sent only %O bytes", sent);
} }
if (rc == 0 && sent == 0) { if (rc == 0 && sent == 0) {
@ -284,19 +283,22 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"writev() not ready"); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
ngx_connection_error(c, err, "writev() failed"); ngx_connection_error(c, err, "writev() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
"writev() not ready");
} }
sent = rc > 0 ? rc : 0; sent = rc > 0 ? rc : 0;

View File

@ -267,22 +267,23 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; eagain = 1;
break;
} else { case NGX_EINTR:
eagain = 1; eintr = 1;
} break;
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, default:
"sendfile() sent only %O bytes", sent);
} else {
wev->error = 1; wev->error = 1;
(void) ngx_connection_error(c, err, "sendfile() failed"); (void) ngx_connection_error(c, err, "sendfile() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,
"sendfile() sent only %O bytes", sent);
} }
/* /*
@ -318,19 +319,22 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"writev() not ready"); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
ngx_connection_error(c, err, "writev() failed"); ngx_connection_error(c, err, "writev() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
"writev() not ready");
} }
sent = rc > 0 ? rc : 0; sent = rc > 0 ? rc : 0;

View File

@ -263,19 +263,22 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"sendfile() is not ready"); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
ngx_connection_error(c, err, "sendfile() failed"); ngx_connection_error(c, err, "sendfile() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
"sendfile() is not ready");
} }
sent = rc > 0 ? rc : 0; sent = rc > 0 ? rc : 0;
@ -290,19 +293,22 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (rc == -1) { if (rc == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"writev() not ready"); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
ngx_connection_error(c, err, "writev() failed"); ngx_connection_error(c, err, "writev() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
"writev() not ready");
} }
sent = rc > 0 ? rc : 0; sent = rc > 0 ? rc : 0;

View File

@ -168,19 +168,22 @@ ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (n == -1) { if (n == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"sendfilev() sent only %uz bytes", sent); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
ngx_connection_error(c, err, "sendfilev() failed"); ngx_connection_error(c, err, "sendfilev() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,
"sendfilev() sent only %uz bytes", sent);
} }
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,

View File

@ -110,19 +110,22 @@ ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (n == -1) { if (n == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN || err == NGX_EINTR) { switch (err) {
if (err == NGX_EINTR) { case NGX_EAGAIN:
eintr = 1; break;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, case NGX_EINTR:
"writev() not ready"); eintr = 1;
break;
} else { default:
wev->error = 1; wev->error = 1;
(void) ngx_connection_error(c, err, "writev() failed"); (void) ngx_connection_error(c, err, "writev() failed");
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
"writev() not ready");
} }
sent = n > 0 ? n : 0; sent = n > 0 ? n : 0;