diff src/event/ngx_event_timer.c @ 6929:3069dd358ba2

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.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 07 Mar 2017 18:51:15 +0300
parents 3efdd7788bb0
children 03928f7f209b
line wrap: on
line diff
--- 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;
-
-    for ( ;; ) {
-        root = ngx_event_timer_rbtree.root;
+    root = ngx_event_timer_rbtree.root;
 
-        if (root == sentinel) {
-            return;
-        }
+    if (root == sentinel) {
+        return NGX_OK;
+    }
 
-        node = ngx_rbtree_min(root, sentinel);
-
+    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
+    /* only cancelable timers left */
 
-        ev->timer_set = 0;
-
-        ev->handler(ev);
-    }
+    return NGX_OK;
 }