summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_kqueue_module.c5
-rw-r--r--src/event/ngx_event.h23
-rw-r--r--src/event/ngx_event_close.c15
-rw-r--r--src/event/ngx_event_recv.c47
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