summaryrefslogtreecommitdiffhomepage
path: root/src/event/modules/ngx_kqueue_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/modules/ngx_kqueue_module.c')
-rw-r--r--src/event/modules/ngx_kqueue_module.c29
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;