Latest update - 7584

This commit is contained in:
2019-10-17 23:53:16 +09:00
parent deb38ff87c
commit a6a35de341
23 changed files with 280 additions and 13 deletions
+35 -1
View File
@@ -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
View File
@@ -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)
+7
View File
@@ -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);
+15
View File
@@ -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)
{
+3
View File
@@ -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()"
+4
View File
@@ -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
+39
View File
@@ -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;
}
+35
View File
@@ -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;
}