aboutsummaryrefslogtreecommitdiff
path: root/src/os/win32/ngx_wsarecv_chain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/win32/ngx_wsarecv_chain.c')
-rw-r--r--src/os/win32/ngx_wsarecv_chain.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/os/win32/ngx_wsarecv_chain.c b/src/os/win32/ngx_wsarecv_chain.c
index 2598e091c..87f023911 100644
--- a/src/os/win32/ngx_wsarecv_chain.c
+++ b/src/os/win32/ngx_wsarecv_chain.c
@@ -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;
}