diff options
Diffstat (limited to 'src/event/modules/ngx_kqueue_module.c')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 29 |
1 files changed, 23 insertions, 6 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; |
