summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_kqueue_module.c31
-rw-r--r--src/event/ngx_event.c2
-rw-r--r--src/event/ngx_event.h21
-rw-r--r--src/event/ngx_event_accept.c10
4 files changed, 57 insertions, 7 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index fc0e34f62..41639fbb7 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2002 Igor Sysoev, http://sysoev.ru
+ * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru
*/
@@ -77,6 +77,9 @@ int ngx_kqueue_init(int max_connections, ngx_log_t *log)
#if (HAVE_CLEAR_EVENT)
|NGX_HAVE_CLEAR_EVENT
#endif
+#if (HAVE_LOWAT_EVENT)
+ |NGX_HAVE_LOWAT_EVENT
+#endif
|NGX_HAVE_KQUEUE_EVENT;
ngx_write_chain_proc = ngx_freebsd_write_chain;
@@ -89,6 +92,14 @@ int ngx_kqueue_init(int max_connections, ngx_log_t *log)
}
+void ngx_kqueue_done(ngx_log_t *log)
+{
+ if (close(kq) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed");
+ }
+}
+
+
int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
{
ev->active = 1;
@@ -173,9 +184,25 @@ int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
change_list[nchanges].ident = c->fd;
change_list[nchanges].filter = filter;
change_list[nchanges].flags = flags;
+ change_list[nchanges].udata = ev;
+
+#if (HAVE_LOWAT_EVENT)
+
+ if ((flags & EV_ADD) && ev->lowat > 0) {
+ change_list[nchanges].fflags = NOTE_LOWAT;
+ change_list[nchanges].data = ev->lowat;
+
+ } else {
+ change_list[nchanges].fflags = 0;
+ change_list[nchanges].data = 0;
+ }
+
+#else
+
change_list[nchanges].fflags = 0;
change_list[nchanges].data = 0;
- change_list[nchanges].udata = ev;
+
+#endif
ev->index = nchanges;
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 1310f34da..2dabf6090 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -153,6 +153,8 @@ void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log)
if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
ev->event_handler = &ngx_event_acceptex;
+ /* LOOK: we call ngx_iocp_add_event() also
+ in ngx_event_post_acceptex() */
if (ngx_iocp_add_event(ev) == NGX_ERROR) {
return NGX_ERROR;
}
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 6af76ff3b..69392eeaf 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -10,6 +10,8 @@
#include <ngx_alloc.h>
#include <ngx_array.h>
+/* STUB */
+#define NGX_LOWAT 10000
#define NGX_INVALID_INDEX 0x80000000
@@ -81,6 +83,10 @@ struct ngx_event_s {
int error;
#endif
+#if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */
+ int lowat;
+#endif
+
#if (HAVE_AIO)
@@ -151,18 +157,23 @@ typedef struct {
/* Event filter has kqueue features - eof flag, errno, available data, etc */
#define NGX_HAVE_KQUEUE_EVENT 8
-/* Event filter notifies only changes (edgesi) but not initial level - epoll */
-#define NGX_HAVE_EDGE_EVENT 16
+/* 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
+
+/* Event filter notifies only changes (edges) but not initial level - epoll */
+#define NGX_HAVE_EDGE_EVENT 32
/* No need to add or delete event filters - rt signals */
-#define NGX_HAVE_SIGIO_EVENT 32
+#define NGX_HAVE_SIGIO_EVENT 64
/* No need to add or delete event filters - overlapped, aio_read, aioread */
-#define NGX_HAVE_AIO_EVENT 64
+#define NGX_HAVE_AIO_EVENT 128
/* 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 128
+#define NGX_HAVE_IOCP_EVENT 256
+
/* Event filter is deleted before closing file. Has no meaning
for select, poll, epoll.
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 65d99da03..3bb141e2f 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -148,6 +148,16 @@ int ngx_event_accept(ngx_event_t *ev)
}
#endif
+#if (HAVE_EDGE_EVENT) /* epoll */
+
+ if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) {
+ if (ngx_edge_add_event(ev) == NGX_ERROR) {
+ return NGX_OK;
+ }
+ }
+
+#endif
+
ls->handler(c);
#if (USE_KQUEUE)