summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_kqueue_module.c4
-rw-r--r--src/event/ngx_event.h54
-rw-r--r--src/event/ngx_event_connect.c2
-rw-r--r--src/event/ngx_event_pipe.c11
4 files changed, 38 insertions, 33 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 1d43ba10e..259054838 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -285,9 +285,9 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
#if (HAVE_LOWAT_EVENT)
- if ((flags & EV_ADD) && ev->lowat > 0) {
+ if (flags & NGX_LOWAT_EVENT) {
change_list[nchanges].fflags = NOTE_LOWAT;
- change_list[nchanges].data = ev->lowat;
+ change_list[nchanges].data = ev->available;
} else {
change_list[nchanges].fflags = 0;
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 83ca9762c..e539d7f1c 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -45,13 +45,20 @@ struct ngx_event_s {
/*
* kqueue only:
* accept: number of sockets that wait to be accepted
- * read: bytes to read
- * write: available space in buffer
+ * read: bytes to read when event is ready
+ * or lowat when event is set with NGX_LOWAT_EVENT flag
+ * write: available space in buffer when event is ready
+ * or lowat when event is set with NGX_LOWAT_EVENT flag
*
* otherwise:
* accept: 1 if accept many, 0 otherwise
*/
+
+#if (HAVE_KQUEUE)
int available;
+#else
+ unsigned available:1;
+#endif
unsigned oneshot:1;
@@ -104,10 +111,6 @@ struct ngx_event_s {
int kq_errno;
#endif
-#if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */
- int lowat;
-#endif
-
#if (HAVE_AIO)
@@ -224,7 +227,11 @@ extern ngx_event_actions_t ngx_event_actions;
* /dev/poll: we need to flush POLLREMOVE event before closing file
*/
-#define NGX_CLOSE_EVENT 1
+#define NGX_CLOSE_EVENT 1
+
+
+/* this flag has meaning only for kqueue */
+#define NGX_LOWAT_EVENT 0
#if (HAVE_KQUEUE)
@@ -233,13 +240,17 @@ extern ngx_event_actions_t ngx_event_actions;
#define NGX_WRITE_EVENT EVFILT_WRITE
/*
- * NGX_CLOSE_EVENT is the module flag and it would not go into a kernel
- * so we need to choose the value that would not interfere with any existent
- * and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR.
- * They are reserved and cleared on a kernel entrance.
+ * NGX_CLOSE_EVENT and NGX_LOWAT_EVENT are the module flags and they would
+ * not go into a kernel so we need to choose the value that would not interfere
+ * with any existent and future kqueue flags. kqueue has such values -
+ * EV_FLAG1, EV_EOF and EV_ERROR. They are reserved and cleared on a kernel
+ * entrance.
*/
#undef NGX_CLOSE_EVENT
-#define NGX_CLOSE_EVENT EV_FLAG1
+#define NGX_CLOSE_EVENT EV_EOF
+
+#undef NGX_LOWAT_EVENT
+#define NGX_LOWAT_EVENT EV_FLAG1
#define NGX_LEVEL_EVENT 0
#define NGX_ONESHOT_EVENT EV_ONESHOT
@@ -351,7 +362,7 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n);
-ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, int close)
+ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, int flags)
{
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
@@ -380,10 +391,8 @@ ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, int close)
return NGX_OK;
}
- if (rev->active && (rev->ready || close)) {
- if (ngx_del_event(rev, NGX_READ_EVENT, close ? NGX_CLOSE_EVENT : 0)
- == NGX_ERROR)
- {
+ if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {
+ if (ngx_del_event(rev, NGX_READ_EVENT, flags) == NGX_ERROR) {
return NGX_ERROR;
}
@@ -423,21 +432,14 @@ ngx_inline static int ngx_handle_level_read_event(ngx_event_t *rev)
}
-ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, int lowat)
+ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, int flags)
{
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
/* kqueue */
-#if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */
-
- if (ngx_event_flags & NGX_HAVE_LOWAT_EVENT) {
- wev->lowat = lowat;
- }
-
-#endif
if (!wev->active && !wev->ready) {
- if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)
+ if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT|flags)
== NGX_ERROR) {
return NGX_ERROR;
}
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
index 296ec7c06..717a4a4b7 100644
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -260,6 +260,8 @@ ngx_log_debug(pc->log, "CONNECT: %s" _ peer->addr_port_text.data);
return NGX_AGAIN;
}
+ngx_log_debug(pc->log, "CONNECTED");
+
wev->ready = 1;
return NGX_OK;
diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c
index 261308913..dddf2cfe1 100644
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -19,6 +19,7 @@ static int ngx_event_pipe_drain_chains(ngx_event_pipe_t *p);
int ngx_event_pipe(ngx_event_pipe_t *p, int do_write)
{
+ int flags;
ngx_event_t *rev, *wev;
for ( ;; ) {
@@ -45,7 +46,9 @@ int ngx_event_pipe(ngx_event_pipe_t *p, int do_write)
if (p->upstream->fd != -1) {
rev = p->upstream->read;
- if (ngx_handle_read_event(rev, (rev->eof || rev->error)) == NGX_ERROR) {
+ flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0;
+
+ if (ngx_handle_read_event(rev, flags) == NGX_ERROR) {
return NGX_ABORT;
}
@@ -54,12 +57,10 @@ int ngx_event_pipe(ngx_event_pipe_t *p, int do_write)
}
}
-ngx_log_debug(p->log, "DOWN: %d" _ p->downstream->fd);
-
if (p->downstream->fd != -1) {
wev = p->downstream->write;
-
- if (ngx_handle_write_event(wev, p->send_lowat) == NGX_ERROR) {
+ wev->available = p->send_lowat;
+ if (ngx_handle_write_event(wev, NGX_LOWAT_EVENT) == NGX_ERROR) {
return NGX_ABORT;
}