diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 31 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 2 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 21 | ||||
| -rw-r--r-- | src/event/ngx_event_accept.c | 10 |
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) |
