diff options
Diffstat (limited to 'src/event/modules')
| -rw-r--r-- | src/event/modules/ngx_epoll_module.c | 108 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 127 | ||||
| -rw-r--r-- | src/event/modules/ngx_rtsig_module.c | 2 |
3 files changed, 124 insertions, 113 deletions
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c index 3f534ff17..fb41fd417 100644 --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c @@ -168,10 +168,11 @@ static int ngx_epoll_init(ngx_cycle_t *cycle) ngx_event_actions = ngx_epoll_module_ctx.actions; #if (HAVE_CLEAR_EVENT) - ngx_event_flags = NGX_USE_CLEAR_EVENT; + ngx_event_flags = NGX_USE_CLEAR_EVENT #else - ngx_event_flags = NGX_USE_LEVEL_EVENT; + ngx_event_flags = NGX_USE_LEVEL_EVENT #endif + |NGX_HAVE_INSTANCE_EVENT; return NGX_OK; } @@ -257,7 +258,7 @@ static int ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags) /* * when the file descriptor is closed the epoll automatically deletes * it from its queue so we do not need to delete explicity the event - * before the closing the file descriptor. + * before the closing the file descriptor */ if (flags & NGX_CLOSE_EVENT) { @@ -339,21 +340,36 @@ static int ngx_epoll_del_connection(ngx_connection_t *c) int ngx_epoll_process_events(ngx_cycle_t *cycle) { - int events; - ngx_int_t instance, i; - size_t n; - ngx_msec_t timer; - ngx_err_t err; - struct timeval tv; - ngx_connection_t *c; - ngx_epoch_msec_t delta; - + int events; + ngx_int_t instance, i; + ngx_uint_t lock, expire; + size_t n; + ngx_msec_t timer; + ngx_err_t err; + struct timeval tv; + ngx_connection_t *c; + ngx_epoch_msec_t delta; timer = ngx_event_find_timer(); ngx_old_elapsed_msec = ngx_elapsed_msec; if (timer == 0) { timer = (ngx_msec_t) -1; + expire = 0; + + } else { + expire = 1; + } + + if (ngx_accept_mutex) { + if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { + return NGX_ERROR; + } + + if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { + timer = ngx_accept_mutex_delay; + expire = 0; + } } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -382,6 +398,7 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle) if (events == 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "epoll_wait() returned no events without timeout"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } } @@ -389,9 +406,17 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle) if (err) { ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, cycle->log, err, "epoll_wait() failed"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + ngx_accept_mutex_unlock(); + return NGX_ERROR; + } + + lock = 1; + for (i = 0; i < events; i++) { c = event_list[i].data.ptr; @@ -434,25 +459,68 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle) c->fd, event_list[i].events); } + if ((event_list[i].events & (EPOLLOUT|EPOLLERR|EPOLLHUP)) + && c->write->active) + { + c->write->ready = 1; + + if (!ngx_threaded && !ngx_accept_mutex_held) { + c->write->event_handler(c->write); + + } else { + ngx_post_event(c->write); + } + } + + /* + * EPOLLIN must be handled after EPOLLOUT because we use + * the optimization to avoid the unnecessary mutex locking/unlocking + * if the accept event is the last one. + */ + if ((event_list[i].events & (EPOLLIN|EPOLLERR|EPOLLHUP)) && c->read->active) { c->read->ready = 1; - c->read->event_handler(c->read); - } - if ((event_list[i].events & (EPOLLOUT|EPOLLERR|EPOLLHUP)) - && c->write->active) - { - c->write->ready = 1; - c->write->event_handler(c->write); + if (!ngx_threaded && !ngx_accept_mutex_held) { + c->read->event_handler(c->read); + + } else if (!c->read->accept) { + ngx_post_event(c->read); + + } else { + ngx_mutex_unlock(ngx_posted_events_mutex); + + c->read->event_handler(c->read); + + if (i + 1 == events) { + lock = 0; + break; + } + + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + ngx_accept_mutex_unlock(); + return NGX_ERROR; + } + } } } - if (timer != (ngx_msec_t) -1 && delta) { + if (lock) { + ngx_mutex_unlock(ngx_posted_events_mutex); + } + + ngx_accept_mutex_unlock(); + + if (expire && delta) { ngx_event_expire_timers((ngx_msec_t) delta); } + if (!ngx_threaded) { + ngx_event_process_posted(cycle); + } + return NGX_OK; } diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 7c39d80b9..c339660db 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -22,9 +22,6 @@ static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); static int ngx_kqueue_process_events(ngx_cycle_t *cycle); -#if (NGX_THREADS) -static void ngx_kqueue_thread_handler(ngx_event_t *ev); -#endif static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); @@ -71,9 +68,6 @@ ngx_event_module_t ngx_kqueue_module_ctx = { NULL, /* add an connection */ NULL, /* delete an connection */ ngx_kqueue_process_events, /* process the events */ -#if (NGX_THREADS0) - ngx_kqueue_thread_handler, /* process an event by thread */ -#endif ngx_kqueue_init, /* init the events */ ngx_kqueue_done /* done the events */ } @@ -161,6 +155,7 @@ static int ngx_kqueue_init(ngx_cycle_t *cycle) #if (HAVE_LOWAT_EVENT) |NGX_HAVE_LOWAT_EVENT #endif + |NGX_HAVE_INSTANCE_EVENT |NGX_HAVE_KQUEUE_EVENT; return NGX_OK; @@ -346,8 +341,8 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) { int events; - ngx_int_t i; - ngx_uint_t instance; + ngx_int_t i, instance; + ngx_uint_t lock, expire; ngx_err_t err; ngx_msec_t timer; ngx_event_t *ev; @@ -364,23 +359,25 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) /* * TODO: if timer is 0 and any worker thread is still busy - * then set 1 second timeout + * then set 500 ms timeout */ #endif ngx_old_elapsed_msec = ngx_elapsed_msec; + expire = 1; if (ngx_accept_mutex) { if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { return NGX_ERROR; } -#if 1 - if (ngx_accept_mutex_held == 0 && timer == 0) { - /* STUB */ timer = 500; + if (ngx_accept_mutex_held == 0 + && (timer == 0 || timer > ngx_accept_mutex_delay)) + { + timer = ngx_accept_mutex_delay; + expire = 0; } -#endif } if (timer) { @@ -390,6 +387,7 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) } else { tp = NULL; + expire = 0; } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -441,6 +439,8 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) return NGX_ERROR; } + lock = 1; + for (i = 0; i < events; i++) { ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -517,105 +517,48 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) continue; } - - if (ngx_threaded || ngx_accept_mutex_held) { - - if (ev->accept) { - ngx_mutex_unlock(ngx_posted_events_mutex); - - ev->event_handler(ev); - - if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { - ngx_accept_mutex_unlock(); - return NGX_ERROR; - } - - } else { - ev->next = (ngx_event_t *) ngx_posted_events; - ngx_posted_events = ev; - } - + if (!ngx_threaded && !ngx_accept_mutex_held) { + ev->event_handler(ev); continue; } - ev->event_handler(ev); - } - - ngx_mutex_unlock(ngx_posted_events_mutex); - - ngx_accept_mutex_unlock(); - - if (timer && delta) { - ngx_event_expire_timers((ngx_msec_t) delta); - } - - if (ngx_threaded) { - return NGX_OK; - } - - for ( ;; ) { - - ev = (ngx_event_t *) ngx_posted_events; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "kevent: posted event " PTR_FMT, ev); - - if (ev == NULL) { - break; + if (!ev->accept) { + ngx_post_event(ev); + continue; } - ngx_posted_events = ev->next; + ngx_mutex_unlock(ngx_posted_events_mutex); - if ((!ev->posted && !ev->active) - || ev->instance != ev->returned_instance) - { - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ + ev->event_handler(ev); - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "kevent: stale event " PTR_FMT, ev); - continue; + if (i + 1 == events) { + lock = 0; + break; } - if (ev->posted) { - ev->posted = 0; + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + ngx_accept_mutex_unlock(); + return NGX_ERROR; } - - ev->event_handler(ev); } - return NGX_OK; -} - + if (lock) { + ngx_mutex_unlock(ngx_posted_events_mutex); + } -#if (NGX_THREADS) + ngx_accept_mutex_unlock(); -static void ngx_kqueue_thread_handler(ngx_event_t *ev) -{ - if ((!ev->posted && !ev->active) - || ev->instance != ev->returned_instance) - { - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent: stale event " PTR_FMT, ev); - return; + if (expire && delta) { + ngx_event_expire_timers((ngx_msec_t) delta); } - if (ev->posted) { - ev->posted = 0; + if (!ngx_threaded) { + ngx_event_process_posted(cycle); } - ev->event_handler(ev); + return NGX_OK; } -#endif - static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle) { diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c index 5686b6eec..19234610d 100644 --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c @@ -117,7 +117,7 @@ static int ngx_rtsig_init(ngx_cycle_t *cycle) ngx_event_actions = ngx_rtsig_module_ctx.actions; - ngx_event_flags = NGX_USE_SIGIO_EVENT; + ngx_event_flags = NGX_USE_SIGIO_EVENT|NGX_HAVE_INSTANCE_EVENT; return NGX_OK; } |
