# HG changeset patch # User Valentin Bartenev # Date 1460122789 -10800 # Node ID dc1ae0056a1e70bb27c28d8f44c2048eb733f915 # Parent 5ad379eab6faeab409026a4f30ce2ba81672f6be Fixed small inconsistency in handling EOF among receive functions. Now all functions always drop the ready flag in this case. diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c --- a/src/os/unix/ngx_readv_chain.c +++ b/src/os/unix/ngx_readv_chain.c @@ -106,7 +106,27 @@ ngx_readv_chain(ngx_connection_t *c, ngx do { n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts); - if (n >= 0) { + if (n == 0) { + rev->ready = 0; + rev->eof = 1; + +#if (NGX_HAVE_KQUEUE) + + /* + * on FreeBSD readv() may return 0 on closed socket + * even if kqueue reported about available data + */ + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available = 0; + } + +#endif + + return 0; + } + + if (n > 0) { #if (NGX_HAVE_KQUEUE) @@ -115,7 +135,7 @@ ngx_readv_chain(ngx_connection_t *c, ngx /* * rev->available may be negative here because some additional - * bytes may be received between kevent() and recv() + * bytes may be received between kevent() and readv() */ if (rev->available <= 0) { @@ -128,37 +148,15 @@ ngx_readv_chain(ngx_connection_t *c, ngx } } - if (n == 0) { - - /* - * on FreeBSD recv() may return 0 on closed socket - * even if kqueue reported about available data - */ - -#if 0 - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "readv() returned 0 while kevent() reported " - "%d available bytes", rev->available); -#endif - - rev->ready = 0; - rev->eof = 1; - rev->available = 0; - } - return n; } -#endif /* NGX_HAVE_KQUEUE */ +#endif if (n < size && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) { rev->ready = 0; } - if (n == 0) { - rev->eof = 1; - } - return n; } diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c --- a/src/os/unix/ngx_recv.c +++ b/src/os/unix/ngx_recv.c @@ -54,7 +54,24 @@ ngx_unix_recv(ngx_connection_t *c, u_cha ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, "recv: fd:%d %z of %uz", c->fd, n, size); - if (n >= 0) { + if (n == 0) { + rev->ready = 0; + rev->eof = 1; + + /* + * on FreeBSD recv() may return 0 on closed socket + * even if kqueue reported about available data + */ + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available = 0; + } + + return 0; + } + + if (n > 0) { + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { rev->available -= n; @@ -73,18 +90,6 @@ ngx_unix_recv(ngx_connection_t *c, u_cha } } - if (n == 0) { - - /* - * on FreeBSD recv() may return 0 on closed socket - * even if kqueue reported about available data - */ - - rev->ready = 0; - rev->eof = 1; - rev->available = 0; - } - return n; } @@ -94,10 +99,6 @@ ngx_unix_recv(ngx_connection_t *c, u_cha rev->ready = 0; } - if (n == 0) { - rev->eof = 1; - } - return n; }