Latest update - 7584
This commit is contained in:
@@ -60,7 +60,7 @@ ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)
|
||||
"readv: eof:%d, avail:%d",
|
||||
rev->pending_eof, rev->available);
|
||||
|
||||
if (!rev->available && !rev->pending_eof) {
|
||||
if (rev->available == 0 && !rev->pending_eof) {
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
}
|
||||
@@ -165,6 +165,40 @@ ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_FIONREAD)
|
||||
|
||||
if (rev->available >= 0) {
|
||||
rev->available -= n;
|
||||
|
||||
/*
|
||||
* negative rev->available means some additional bytes
|
||||
* were received between kernel notification and readv(),
|
||||
* and therefore ev->ready can be safely reset even for
|
||||
* edge-triggered event methods
|
||||
*/
|
||||
|
||||
if (rev->available < 0) {
|
||||
rev->available = 0;
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"readv: avail:%d", rev->available);
|
||||
|
||||
} else if (n == size) {
|
||||
|
||||
if (ngx_socket_nread(c->fd, &rev->available) == -1) {
|
||||
n = ngx_connection_error(c, ngx_socket_errno,
|
||||
ngx_socket_nread_n " failed");
|
||||
break;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"readv: avail:%d", rev->available);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_EPOLLRDHUP)
|
||||
|
||||
if ((ngx_event_flags & NGX_USE_EPOLL_EVENT)
|
||||
|
||||
+35
-1
@@ -57,7 +57,7 @@ ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
|
||||
"recv: eof:%d, avail:%d",
|
||||
rev->pending_eof, rev->available);
|
||||
|
||||
if (!rev->available && !rev->pending_eof) {
|
||||
if (rev->available == 0 && !rev->pending_eof) {
|
||||
rev->ready = 0;
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
@@ -116,6 +116,40 @@ ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_FIONREAD)
|
||||
|
||||
if (rev->available >= 0) {
|
||||
rev->available -= n;
|
||||
|
||||
/*
|
||||
* negative rev->available means some additional bytes
|
||||
* were received between kernel notification and recv(),
|
||||
* and therefore ev->ready can be safely reset even for
|
||||
* edge-triggered event methods
|
||||
*/
|
||||
|
||||
if (rev->available < 0) {
|
||||
rev->available = 0;
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"recv: avail:%d", rev->available);
|
||||
|
||||
} else if ((size_t) n == size) {
|
||||
|
||||
if (ngx_socket_nread(c->fd, &rev->available) == -1) {
|
||||
n = ngx_connection_error(c, ngx_socket_errno,
|
||||
ngx_socket_nread_n " failed");
|
||||
break;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"recv: avail:%d", rev->available);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_EPOLLRDHUP)
|
||||
|
||||
if ((ngx_event_flags & NGX_USE_EPOLL_EVENT)
|
||||
|
||||
@@ -38,6 +38,13 @@ int ngx_blocking(ngx_socket_t s);
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_FIONREAD)
|
||||
|
||||
#define ngx_socket_nread(s, n) ioctl(s, FIONREAD, n)
|
||||
#define ngx_socket_nread_n "ioctl(FIONREAD)"
|
||||
|
||||
#endif
|
||||
|
||||
int ngx_tcp_nopush(ngx_socket_t s);
|
||||
int ngx_tcp_push(ngx_socket_t s);
|
||||
|
||||
|
||||
@@ -27,6 +27,21 @@ ngx_blocking(ngx_socket_t s)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ngx_socket_nread(ngx_socket_t s, int *n)
|
||||
{
|
||||
unsigned long nread;
|
||||
|
||||
if (ioctlsocket(s, FIONREAD, &nread) == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
*n = nread;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ngx_tcp_push(ngx_socket_t s)
|
||||
{
|
||||
|
||||
@@ -31,6 +31,9 @@ int ngx_blocking(ngx_socket_t s);
|
||||
#define ngx_nonblocking_n "ioctlsocket(FIONBIO)"
|
||||
#define ngx_blocking_n "ioctlsocket(!FIONBIO)"
|
||||
|
||||
int ngx_socket_nread(ngx_socket_t s, int *n);
|
||||
#define ngx_socket_nread_n "ioctlsocket(FIONREAD)"
|
||||
|
||||
#define ngx_shutdown_socket shutdown
|
||||
#define ngx_shutdown_socket_n "shutdown()"
|
||||
|
||||
|
||||
@@ -273,6 +273,10 @@ typedef int sig_atomic_t;
|
||||
#define NGX_HAVE_SO_SNDLOWAT 0
|
||||
#endif
|
||||
|
||||
#ifndef NGX_HAVE_FIONREAD
|
||||
#define NGX_HAVE_FIONREAD 1
|
||||
#endif
|
||||
|
||||
#define NGX_HAVE_GETADDRINFO 1
|
||||
|
||||
#define ngx_random rand
|
||||
|
||||
@@ -51,6 +51,45 @@ ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
|
||||
return n;
|
||||
}
|
||||
|
||||
#if (NGX_HAVE_FIONREAD)
|
||||
|
||||
if (rev->available >= 0 && bytes > 0) {
|
||||
rev->available -= bytes;
|
||||
|
||||
/*
|
||||
* negative rev->available means some additional bytes
|
||||
* were received between kernel notification and WSARecv(),
|
||||
* and therefore ev->ready can be safely reset even for
|
||||
* edge-triggered event methods
|
||||
*/
|
||||
|
||||
if (rev->available < 0) {
|
||||
rev->available = 0;
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"WSARecv: avail:%d", rev->available);
|
||||
|
||||
} else if (bytes == size) {
|
||||
|
||||
if (ngx_socket_nread(c->fd, &rev->available) == -1) {
|
||||
n = ngx_connection_error(c, ngx_socket_errno,
|
||||
ngx_socket_nread_n " failed");
|
||||
|
||||
if (n == NGX_ERROR) {
|
||||
rev->error = 1;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"WSARecv: avail:%d", rev->available);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (bytes < size) {
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,41 @@ ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
#if (NGX_HAVE_FIONREAD)
|
||||
|
||||
if (rev->available >= 0 && bytes > 0) {
|
||||
rev->available -= bytes;
|
||||
|
||||
/*
|
||||
* negative rev->available means some additional bytes
|
||||
* were received between kernel notification and WSARecv(),
|
||||
* and therefore ev->ready can be safely reset even for
|
||||
* edge-triggered event methods
|
||||
*/
|
||||
|
||||
if (rev->available < 0) {
|
||||
rev->available = 0;
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"WSARecv: avail:%d", rev->available);
|
||||
|
||||
} else if (bytes == size) {
|
||||
|
||||
if (ngx_socket_nread(c->fd, &rev->available) == -1) {
|
||||
rev->error = 1;
|
||||
ngx_connection_error(c, ngx_socket_errno,
|
||||
ngx_socket_nread_n " failed");
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"WSARecv: avail:%d", rev->available);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (bytes < size) {
|
||||
rev->ready = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user