diff options
Diffstat (limited to 'src/event/ngx_event_accept.c')
-rw-r--r-- | src/event/ngx_event_accept.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index 238a49415..f1745c15a 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -13,6 +13,8 @@ #define NGX_SOCKLEN 512 +static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle); +static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle); static void ngx_close_accepted_connection(ngx_connection_t *c); @@ -262,15 +264,20 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle) ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "accept mutex locked"); - if (!ngx_accept_mutex_held) { - if (ngx_enable_accept_events(cycle) == NGX_ERROR) { - *ngx_accept_mutex = 0; - return NGX_ERROR; - } + if (ngx_accept_mutex_held + && (!(ngx_event_flags & NGX_USE_RTSIG_EVENT) + || *ngx_accept_mutex_last_owner == (ngx_atomic_t) ngx_pid)) + { + return NGX_OK; + } - ngx_accept_mutex_held = 1; + if (ngx_enable_accept_events(cycle) == NGX_ERROR) { + *ngx_accept_mutex = 0; + return NGX_ERROR; } + ngx_accept_mutex_held = 1; + return NGX_OK; } @@ -286,7 +293,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle) } -ngx_int_t +static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle) { ngx_uint_t i; @@ -299,10 +306,17 @@ ngx_enable_accept_events(ngx_cycle_t *cycle) c = ls[i].connection; if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { + + if (ngx_accept_mutex_held) { + c->read->disabled = 1; + } + if (ngx_add_conn(c) == NGX_ERROR) { return NGX_ERROR; } + *ngx_accept_mutex_last_owner = ngx_pid; + } else { if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; @@ -314,7 +328,7 @@ ngx_enable_accept_events(ngx_cycle_t *cycle) } -ngx_int_t +static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle) { ngx_uint_t i; |