diff options
author | Igor Sysoev <igor@sysoev.ru> | 2007-09-01 11:59:36 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2007-09-01 11:59:36 +0000 |
commit | a2883a66df626c4de3957e42f4fb5181ba7848c1 (patch) | |
tree | 5a5f8b75f1d69691f18ac4fdaf60c647773bcb04 | |
parent | 954e7e07398f63765e35284a1e69aaa3ba5f17e7 (diff) | |
download | nginx-a2883a66df626c4de3957e42f4fb5181ba7848c1.tar.gz nginx-a2883a66df626c4de3957e42f4fb5181ba7848c1.zip |
NGX_USE_VNODE_EVENT and NGX_FLUSH_EVENT
-rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 28 | ||||
-rw-r--r-- | src/event/ngx_event.h | 22 |
2 files changed, 40 insertions, 10 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 9ef8bf2c6..1b1f9712f 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -200,7 +200,9 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer) } } - ngx_event_flags = 0; + ngx_event_flags = NGX_USE_ONESHOT_EVENT + |NGX_USE_KQUEUE_EVENT + |NGX_USE_VNODE_EVENT; #if (NGX_HAVE_TIMER_EVENT) @@ -226,8 +228,6 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer) #endif - ngx_event_flags |= NGX_USE_ONESHOT_EVENT|NGX_USE_KQUEUE_EVENT; - #if (NGX_HAVE_CLEAR_EVENT) ngx_event_flags |= NGX_USE_CLEAR_EVENT; #else @@ -389,10 +389,12 @@ ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) if (flags & NGX_DISABLE_EVENT) { ev->disabled = 1; + + } else { + flags |= EV_DELETE; } - rc = ngx_kqueue_set_event(ev, event, - flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); + rc = ngx_kqueue_set_event(ev, event, flags); ngx_mutex_unlock(list_mutex); @@ -466,6 +468,22 @@ ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags) ev->index = nchanges; nchanges++; + if (flags & NGX_FLUSH_EVENT) { + ts.tv_sec = 0; + ts.tv_nsec = 0; + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush"); + + if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); + return NGX_ERROR; + } + + nchanges = 0; + } + return NGX_OK; } diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 059a95229..ed6ba29c1 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -291,6 +291,10 @@ extern ngx_event_actions_t ngx_event_actions; */ #define NGX_USE_EVENTPORT_EVENT 0x00001000 +/* + * The event filter support vnode notifications: kqueue. + */ +#define NGX_USE_VNODE_EVENT 0x00002000 /* @@ -311,6 +315,11 @@ extern ngx_event_actions_t ngx_event_actions; */ #define NGX_DISABLE_EVENT 2 +/* + * event must be passed to kernel right now, do not wait until batch processing. + */ +#define NGX_FLUSH_EVENT 4 + /* these flags have a meaning only for kqueue */ #define NGX_LOWAT_EVENT 0 @@ -326,11 +335,11 @@ extern ngx_event_actions_t ngx_event_actions; #define NGX_VNODE_EVENT EVFILT_VNODE /* - * 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. + * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags + * and they must not go into a kernel so we need to choose the value + * that must 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_EOF @@ -338,6 +347,9 @@ extern ngx_event_actions_t ngx_event_actions; #undef NGX_LOWAT_EVENT #define NGX_LOWAT_EVENT EV_FLAG1 +#undef NGX_FLUSH_EVENT +#define NGX_FLUSH_EVENT EV_ERROR + #define NGX_LEVEL_EVENT 0 #define NGX_ONESHOT_EVENT EV_ONESHOT #define NGX_CLEAR_EVENT EV_CLEAR |