diff options
Diffstat (limited to '')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 29 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 19 | ||||
| -rw-r--r-- | src/event/ngx_event_accept.c | 19 | ||||
| -rw-r--r-- | src/event/ngx_event_posted.c | 24 | ||||
| -rw-r--r-- | src/event/ngx_event_posted.h | 18 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.c | 9 |
6 files changed, 66 insertions, 52 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 379e5304d..c9ef3b8ab 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -236,7 +236,12 @@ static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) ev->active = 0; ev->disabled = 0; + + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + return NGX_ERROR; + } ev->posted = 0; + ngx_mutex_unlock(ngx_posted_events_mutex); if (ngx_thread_main() && nchanges > 0 @@ -519,12 +524,26 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) continue; } - ev->returned_instance = instance; - if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { ngx_kqueue_dump_event(ev->log, &event_list[i]); } + ev->returned_instance = instance; + + if (!ev->accept && (ngx_threaded || ngx_accept_mutex_held)) { + ev->posted_ready = 1; + ev->posted_available += event_list[i].data; + + if (event_list[i].flags & EV_EOF) { + ev->posted_eof = 1; + ev->posted_errno = event_list[i].fflags; + } + + ngx_post_event(ev); + + continue; + } + ev->available = event_list[i].data; if (event_list[i].flags & EV_EOF) { @@ -532,10 +551,6 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) ev->kq_errno = event_list[i].fflags; } - if (ev->oneshot && ev->timer_set) { - ngx_del_timer(ev); - } - ev->ready = 1; break; @@ -563,10 +578,12 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) continue; } +#if 0 if (!ev->accept) { ngx_post_event(ev); continue; } +#endif if (ngx_accept_disabled > 0) { continue; diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 8e30ccddf..d3a96bd6e 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -155,7 +155,26 @@ struct ngx_event_s { #if (NGX_THREADS) + ngx_atomic_t *lock; + + unsigned locked:1; + + unsigned posted_ready:1; + unsigned posted_timedout:1; + unsigned posted_eof:1; + +#if (HAVE_KQUEUE) + /* the pending errno reported by kqueue */ + int posted_errno; +#endif + +#if (HAVE_KQUEUE) || (HAVE_IOCP) + int posted_available; +#else + unsigned posted_available:1; +#endif + #endif diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index 18f8586cd..6401b6aef 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -210,25 +210,6 @@ void ngx_event_accept(ngx_event_t *ev) rinstance = rev->returned_instance; winstance = wev->returned_instance; -#if (NGX_THREADS) - - /* - * We has to acquire the lock to avoid the race condition when - * the connection was just closed by another thread but its lock - * is not unlocked at this point and we got the same descriptor. - * - * The condition should be too rare. - */ - - if (ngx_trylock(&c->lock) == 0) { - - /* TODO: ngx_cycle->stat.accept.spinlock++; */ - - ngx_spinlock(&c->lock, 1000); - } - -#endif - ngx_memzero(rev, sizeof(ngx_event_t)); ngx_memzero(wev, sizeof(ngx_event_t)); ngx_memzero(c, sizeof(ngx_connection_t)); diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c index 0c91f4ea5..975079fc5 100644 --- a/src/event/ngx_event_posted.c +++ b/src/event/ngx_event_posted.c @@ -76,6 +76,10 @@ ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle) return NGX_OK; } + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "posted event lock:%d " PTR_FMT, + *(ev->lock), ev->lock); + if (ngx_trylock(ev->lock) == 0) { ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -107,23 +111,31 @@ ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle) continue; } - ngx_mutex_unlock(ngx_posted_events_mutex); + ev->locked = 1; if (ev->posted) { + ev->ready = ev->posted_ready; + ev->timedout = ev->posted_timedout; + ev->available = ev->posted_available; + ev->kq_eof = ev->posted_eof; +#if (HAVE_KQUEUE) + ev->kq_errno = ev->posted_errno; +#endif ev->posted = 0; - if (!ev->timedout) { - ev->ready = 1; - } } - ev->event_handler(ev); + ngx_mutex_unlock(ngx_posted_events_mutex); - ngx_unlock(ev->lock); + ev->event_handler(ev); if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { return NGX_ERROR; } + if (ev->locked) { + ngx_unlock(ev->lock); + } + break; } } diff --git a/src/event/ngx_event_posted.h b/src/event/ngx_event_posted.h index 5059fa9ad..9d9f70220 100644 --- a/src/event/ngx_event_posted.h +++ b/src/event/ngx_event_posted.h @@ -7,27 +7,11 @@ #include <ngx_event.h> -typedef struct ngx_posted_events_s ngx_posted_event_t; - -struct ngx_posted_events_s { - ngx_event_t *event; - ngx_posted_event_t *next; - - unsigned instance:1; - unsigned ready:1; - unsigned timedout:1; - unsigned complete:1; -}; - - #define ngx_post_event(ev) \ if (!ev->posted) { \ ev->next = (ngx_event_t *) ngx_posted_events; \ ngx_posted_events = ev; \ ev->posted = 1; \ - } - -/* \ ngx_log_debug3(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, \ "POST: %08X %08X %08X", ngx_posted_events, \ @@ -35,7 +19,7 @@ struct ngx_posted_events_s { ((ngx_posted_events && ngx_posted_events->next) ? \ ngx_posted_events->next->next: 0)); \ \ -*/ +} /* \ diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index 893b2a9e1..c10e23069 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -110,25 +110,26 @@ void ngx_event_expire_timers(ngx_msec_t timer) #endif ev->timer_set = 0; - ev->timedout = 1; -#if (NGX_THREADS) - ngx_unlock(ev->lock); -#endif if (ngx_threaded) { if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { return; } + ev->posted_timedout = 1; ngx_post_event(ev); ngx_mutex_unlock(ngx_posted_events_mutex); continue; } + ev->timedout = 1; + ev->event_handler(ev); + continue; } + break; } |
