diff src/event/modules/ngx_iocp_module.c @ 461:a88a3e4e158f release-0.1.5

nginx-0.1.5-RELEASE import *) Bugfix: on Solaris and Linux there may be too many "recvmsg() returned not enough data" alerts. *) Bugfix: there were the "writev() failed (22: Invalid argument)" errors on Solaris in proxy mode without sendfile. On other platforms that do not support sendfile at all the process got caught in an endless loop. *) Bugfix: segmentation fault on Solaris in proxy mode and using sendfile. *) Bugfix: segmentation fault on Solaris. *) Bugfix: on-line upgrade did not work on Linux. *) Bugfix: the ngx_http_autoindex_module module did not escape the spaces, the quotes, and the percent signs in the directory listing. *) Change: the decrease of the copy operations. *) Feature: the userid_p3p directive.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 11 Nov 2004 14:07:14 +0000
parents 42d11f017717
children d4ea69372b94
line wrap: on
line diff
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -82,7 +82,7 @@ ngx_os_io_t ngx_iocp_io = {
     ngx_overlapped_wsarecv,
     NULL,
     NULL,
-    ngx_wsasend_chain,
+    ngx_overlapped_wsasend_chain,
     0
 };
 
@@ -138,7 +138,7 @@ static ngx_int_t ngx_iocp_add_event(ngx_
     c->write->active = 1;
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp);
+                   "iocp add: fd:%d k:%d ov:%p", c->fd, key, &ev->ovlp);
 
     if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
@@ -152,10 +152,16 @@ static ngx_int_t ngx_iocp_add_event(ngx_
 
 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags)
 {
+#if 0
+    if (flags & NGX_CLOSE_EVENT) {
+        return NGX_OK;
+    }
+
     if (CancelIo((HANDLE) c->fd) == 0) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");
         return NGX_ERROR;
     }
+#endif
 
     return NGX_OK;
 }
@@ -195,12 +201,19 @@ static ngx_int_t ngx_iocp_process_events
     ngx_time_update(tv.tv_sec);
 
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp);
+                   "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp);
 
     delta = ngx_elapsed_msec;
     ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000
                                           + tv.tv_usec / 1000 - ngx_start_msec;
 
+    if (timer != INFINITE) {
+        delta = ngx_elapsed_msec - delta;
+
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                       "iocp timer: %d, delta: %d", timer, (int) delta);
+    }
+
     if (err) {
         if (ovlp == NULL) {
             if (err != WAIT_TIMEOUT) {
@@ -210,48 +223,75 @@ static ngx_int_t ngx_iocp_process_events
                 return NGX_ERROR;
             }
 
-        } else {
-            ovlp->error = err;
+            if (timer != INFINITE && delta) {
+                ngx_event_expire_timers((ngx_msec_t) delta);
+            }
+
+            return NGX_OK;
         }
+
+        ovlp->error = err;
     }
 
-    if (timer != INFINITE) {
-        delta = ngx_elapsed_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp timer: %d, delta: %d", timer, (int) delta);
+    if (ovlp == NULL) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "GetQueuedCompletionStatus() returned no operation");
+        return NGX_ERROR;
     }
 
-    if (ovlp) {
-        ev = ovlp->event;
+
+    ev = ovlp->event;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev);
+
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp event:" PTR_FMT, ev);
+    if (err == ERROR_NETNAME_DELETED /* the socket was closed */
+        || err == ERROR_OPERATION_ABORTED /* the operation was canceled */)
+    {
 
-        switch (key) {
+        /*
+         * the WSA_OPERATION_ABORTED completion notification
+         * for a file descriptor that was closed
+         */
 
-        case NGX_IOCP_ACCEPT:
-            if (bytes) {
-                ev->ready = 1;
-            }
-            break;
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,
+                       "iocp: aborted event %p", ev); 
+
+        if (timer != INFINITE && delta) {
+            ngx_event_expire_timers((ngx_msec_t) delta);
+        }
+
+        return NGX_OK;
+    }
 
-        case NGX_IOCP_IO:
-            ev->complete = 1;
-            ev->ready = 1;
-            break;
+    if (err) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
+                      "GetQueuedCompletionStatus() returned operation error");
+    }
 
-        case NGX_IOCP_CONNECT:
+    switch (key) {
+
+    case NGX_IOCP_ACCEPT:
+        if (bytes) {
             ev->ready = 1;
         }
+        break;
 
-        ev->available = bytes;
+    case NGX_IOCP_IO:
+        ev->complete = 1;
+        ev->ready = 1;
+        break;
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp event handler: " PTR_FMT, ev->event_handler);
+    case NGX_IOCP_CONNECT:
+        ev->ready = 1;
+    }
 
-        ev->event_handler(ev);
-    }
+    ev->available = bytes;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "iocp event handler: %p", ev->event_handler);
+
+    ev->event_handler(ev);
 
     if (timer != INFINITE && delta) {
         ngx_event_expire_timers((ngx_msec_t) delta);