Mercurial > hg > nginx
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);