diff options
| author | Maxim Dounin <mdounin@mdounin.ru> | 2017-03-07 18:51:15 +0300 |
|---|---|---|
| committer | Maxim Dounin <mdounin@mdounin.ru> | 2017-03-07 18:51:15 +0300 |
| commit | 1a58418ae76a96c830a0536432e96a9ad051bc58 (patch) | |
| tree | fb1df1b233a9225fdcf343abeffbfb903fb19b3f /src/event/ngx_event_timer.c | |
| parent | 0212c7fac1a63d33c9b0084ed75803713af8a230 (diff) | |
| download | nginx-1a58418ae76a96c830a0536432e96a9ad051bc58.tar.gz nginx-1a58418ae76a96c830a0536432e96a9ad051bc58.tar.bz2 | |
Cancelable timers are now preserved if there are other timers.
There is no need to cancel timers early if there are other timers blocking
shutdown anyway. Preserving such timers allows nginx to continue some
periodic work till the shutdown is actually possible.
With the new approach, timers with ev->cancelable are simply ignored when
checking if there are any timers left during shutdown.
Diffstat (limited to '')
| -rw-r--r-- | src/event/ngx_event_timer.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index 8f547b215..20e52f45e 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -96,43 +96,31 @@ ngx_event_expire_timers(void) } -void -ngx_event_cancel_timers(void) +ngx_int_t +ngx_event_no_timers_left(void) { ngx_event_t *ev; ngx_rbtree_node_t *node, *root, *sentinel; sentinel = ngx_event_timer_rbtree.sentinel; + root = ngx_event_timer_rbtree.root; - for ( ;; ) { - root = ngx_event_timer_rbtree.root; - - if (root == sentinel) { - return; - } - - node = ngx_rbtree_min(root, sentinel); + if (root == sentinel) { + return NGX_OK; + } + for (node = ngx_rbtree_min(root, sentinel); + node; + node = ngx_rbtree_next(&ngx_event_timer_rbtree, node)) + { ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer)); if (!ev->cancelable) { - return; + return NGX_AGAIN; } + } - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer cancel: %d: %M", - ngx_event_ident(ev->data), ev->timer.key); - - ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer); - -#if (NGX_DEBUG) - ev->timer.left = NULL; - ev->timer.right = NULL; - ev->timer.parent = NULL; -#endif - - ev->timer_set = 0; + /* only cancelable timers left */ - ev->handler(ev); - } + return NGX_OK; } |
