diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 5 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 23 | ||||
| -rw-r--r-- | src/event/ngx_event_close.c | 15 | ||||
| -rw-r--r-- | src/event/ngx_event_recv.c | 47 |
4 files changed, 63 insertions, 27 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 41639fbb7..b49eb62bb 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -74,12 +74,17 @@ int ngx_kqueue_init(int max_connections, ngx_log_t *log) ngx_event_flags = NGX_HAVE_LEVEL_EVENT |NGX_HAVE_ONESHOT_EVENT + #if (HAVE_CLEAR_EVENT) |NGX_HAVE_CLEAR_EVENT +#else + |NGX_USE_LEVEL_EVENT #endif + #if (HAVE_LOWAT_EVENT) |NGX_HAVE_LOWAT_EVENT #endif + |NGX_HAVE_KQUEUE_EVENT; ngx_write_chain_proc = ngx_freebsd_write_chain; diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 7bffa6884..c36306db7 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -56,7 +56,6 @@ struct ngx_event_s { /* otherwise: */ /* accept: 1 if accept many, 0 otherwise */ - unsigned level:1; unsigned oneshot:1; #if 0 @@ -73,6 +72,7 @@ struct ngx_event_s { unsigned process:1; unsigned read_discarded:1; + unsigned ignore_econnreset:1; unsigned unexpected_eof:1; #if (HAVE_DEFERRED_ACCEPT) @@ -149,7 +149,7 @@ typedef struct { #define NGX_HAVE_LEVEL_EVENT 1 /* Event filter is deleted after notification - select, poll, kqueue. - Using /dev/poll, epoll it can be implemented with additional syscall */ + Using /dev/poll it can be implemented with additional syscall */ #define NGX_HAVE_ONESHOT_EVENT 2 /* Event filter notifies only changes and initial level - kqueue */ @@ -159,21 +159,24 @@ typedef struct { #define NGX_HAVE_KQUEUE_EVENT 8 /* Event filter supports low water mark - kqueue's NOTE_LOWAT, - early kqueue implementations have no NOTE_LOWAT so we need separate flag */ -#define NGX_HAVE_LOWAT_EVENT 16 + early kqueue implementations have no NOTE_LOWAT so we need a separate flag */ +#define NGX_HAVE_LOWAT_EVENT 0x00000010 /* Event filter notifies only changes (edges) but not initial level - epoll */ -#define NGX_HAVE_EDGE_EVENT 32 +#define NGX_HAVE_EDGE_EVENT 0x00000020 /* No need to add or delete event filters - rt signals */ -#define NGX_HAVE_SIGIO_EVENT 64 +#define NGX_HAVE_SIGIO_EVENT 0x00000040 /* No need to add or delete event filters - overlapped, aio_read, aioread */ -#define NGX_HAVE_AIO_EVENT 128 +#define NGX_HAVE_AIO_EVENT 0x00000080 -/* Need to add socket or halde only once - i/o completion port. - It also requires to set HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT */ -#define NGX_HAVE_IOCP_EVENT 256 +/* Need to add socket or handle only once - i/o completion port. + It also requires HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT to be set */ +#define NGX_HAVE_IOCP_EVENT 0x00000100 + + +#define NGX_USE_LEVEL_EVENT 0x00010000 /* Event filter is deleted before closing file. Has no meaning diff --git a/src/event/ngx_event_close.c b/src/event/ngx_event_close.c index 8c8fd1bef..06e911759 100644 --- a/src/event/ngx_event_close.c +++ b/src/event/ngx_event_close.c @@ -13,15 +13,20 @@ int ngx_event_close_connection(ngx_event_t *ev) int rc; ngx_connection_t *c = (ngx_connection_t *) ev->data; - ngx_log_debug(c->log, "CLOSE: %d" _ c->fd); + ngx_log_debug(c->log, "close connection: %d" _ c->fd); ngx_assert((c->fd != -1), return NGX_ERROR, c->log, "ngx_event_close: already closed"); - ngx_destroy_pool(c->pool); + if (c->read->timer_set) { + ngx_del_timer(c->read); + c->read->timer_set = 0; + } - ngx_del_timer(c->read); - ngx_del_timer(c->write); + if (c->write->timer_set) { + ngx_del_timer(c->write); + c->write->timer_set = 0; + } ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT); ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT); @@ -32,5 +37,7 @@ int ngx_event_close_connection(ngx_event_t *ev) c->fd = -1; + ngx_destroy_pool(c->pool); + return rc; } diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c index 39eb32014..46c165af1 100644 --- a/src/event/ngx_event_recv.c +++ b/src/event/ngx_event_recv.c @@ -10,23 +10,34 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) { int n; ngx_err_t err; + ngx_event_t *ev; - if (c->read->timedout) { + ev = c->read; + + if (ev->timedout) { ngx_set_socket_errno(NGX_ETIMEDOUT); ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "recv() failed"); return NGX_ERROR; } #if (HAVE_KQUEUE) - ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ - c->read->eof _ c->read->available _ c->read->error); + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ + ev->eof _ ev->available _ ev->error); + } #endif #if (USE_KQUEUE) - if (c->read->eof && c->read->available == 0) { - if (c->read->error) { - ngx_log_error(NGX_LOG_ERR, c->log, c->read->error, + if (ev->eof && ev->available == 0) { + if (ev->error) { + ngx_set_socket_errno(ev->error); + + if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { + return 0; + } + + ngx_log_error(NGX_LOG_ERR, c->log, ev->error, "recv() failed"); return NGX_ERROR; } @@ -36,10 +47,16 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) #elif (HAVE_KQUEUE) - if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) { - if (c->read->eof && c->read->available == 0) { - if (c->read->error) { - ngx_log_error(NGX_LOG_ERR, c->log, c->read->error, + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + if (ev->eof && ev->available == 0) { + if (ev->error) { + ngx_set_socket_errno(ev->error); + + if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { + return 0; + } + + ngx_log_error(NGX_LOG_ERR, c->log, ev->error, "recv() failed"); return NGX_ERROR; } @@ -55,6 +72,10 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) if (n == -1) { err = ngx_socket_errno; + if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { + return 0; + } + if (err == NGX_EAGAIN) { ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returns EAGAIN"); return NGX_AGAIN; @@ -66,12 +87,12 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) #if (USE_KQUEUE) - c->read->available -= n; + ev->available -= n; #elif (HAVE_KQUEUE) - if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) { - c->read->available -= n; + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + ev->available -= n; } #endif |
