Mercurial > hg > nginx
comparison 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 |
comparison
equal
deleted
inserted
replaced
6928:e0cc454aafe4 | 6929:3069dd358ba2 |
---|---|
94 ev->handler(ev); | 94 ev->handler(ev); |
95 } | 95 } |
96 } | 96 } |
97 | 97 |
98 | 98 |
99 void | 99 ngx_int_t |
100 ngx_event_cancel_timers(void) | 100 ngx_event_no_timers_left(void) |
101 { | 101 { |
102 ngx_event_t *ev; | 102 ngx_event_t *ev; |
103 ngx_rbtree_node_t *node, *root, *sentinel; | 103 ngx_rbtree_node_t *node, *root, *sentinel; |
104 | 104 |
105 sentinel = ngx_event_timer_rbtree.sentinel; | 105 sentinel = ngx_event_timer_rbtree.sentinel; |
106 root = ngx_event_timer_rbtree.root; | |
106 | 107 |
107 for ( ;; ) { | 108 if (root == sentinel) { |
108 root = ngx_event_timer_rbtree.root; | 109 return NGX_OK; |
110 } | |
109 | 111 |
110 if (root == sentinel) { | 112 for (node = ngx_rbtree_min(root, sentinel); |
111 return; | 113 node; |
112 } | 114 node = ngx_rbtree_next(&ngx_event_timer_rbtree, node)) |
113 | 115 { |
114 node = ngx_rbtree_min(root, sentinel); | |
115 | |
116 ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer)); | 116 ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer)); |
117 | 117 |
118 if (!ev->cancelable) { | 118 if (!ev->cancelable) { |
119 return; | 119 return NGX_AGAIN; |
120 } | 120 } |
121 } | |
121 | 122 |
122 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 123 /* only cancelable timers left */ |
123 "event timer cancel: %d: %M", | |
124 ngx_event_ident(ev->data), ev->timer.key); | |
125 | 124 |
126 ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer); | 125 return NGX_OK; |
127 | |
128 #if (NGX_DEBUG) | |
129 ev->timer.left = NULL; | |
130 ev->timer.right = NULL; | |
131 ev->timer.parent = NULL; | |
132 #endif | |
133 | |
134 ev->timer_set = 0; | |
135 | |
136 ev->handler(ev); | |
137 } | |
138 } | 126 } |