mirror of
https://github.com/nginx/nginx.git
synced 2024-12-16 06:09:00 +08:00
1a58418ae7
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.
91 lines
2.0 KiB
C
91 lines
2.0 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
* Copyright (C) Nginx, Inc.
|
|
*/
|
|
|
|
|
|
#ifndef _NGX_EVENT_TIMER_H_INCLUDED_
|
|
#define _NGX_EVENT_TIMER_H_INCLUDED_
|
|
|
|
|
|
#include <ngx_config.h>
|
|
#include <ngx_core.h>
|
|
#include <ngx_event.h>
|
|
|
|
|
|
#define NGX_TIMER_INFINITE (ngx_msec_t) -1
|
|
|
|
#define NGX_TIMER_LAZY_DELAY 300
|
|
|
|
|
|
ngx_int_t ngx_event_timer_init(ngx_log_t *log);
|
|
ngx_msec_t ngx_event_find_timer(void);
|
|
void ngx_event_expire_timers(void);
|
|
ngx_int_t ngx_event_no_timers_left(void);
|
|
|
|
|
|
extern ngx_rbtree_t ngx_event_timer_rbtree;
|
|
|
|
|
|
static ngx_inline void
|
|
ngx_event_del_timer(ngx_event_t *ev)
|
|
{
|
|
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
|
|
"event timer del: %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;
|
|
}
|
|
|
|
|
|
static ngx_inline void
|
|
ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
|
|
{
|
|
ngx_msec_t key;
|
|
ngx_msec_int_t diff;
|
|
|
|
key = ngx_current_msec + timer;
|
|
|
|
if (ev->timer_set) {
|
|
|
|
/*
|
|
* Use a previous timer value if difference between it and a new
|
|
* value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows
|
|
* to minimize the rbtree operations for fast connections.
|
|
*/
|
|
|
|
diff = (ngx_msec_int_t) (key - ev->timer.key);
|
|
|
|
if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) {
|
|
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
|
|
"event timer: %d, old: %M, new: %M",
|
|
ngx_event_ident(ev->data), ev->timer.key, key);
|
|
return;
|
|
}
|
|
|
|
ngx_del_timer(ev);
|
|
}
|
|
|
|
ev->timer.key = key;
|
|
|
|
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
|
|
"event timer add: %d: %M:%M",
|
|
ngx_event_ident(ev->data), timer, ev->timer.key);
|
|
|
|
ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer);
|
|
|
|
ev->timer_set = 1;
|
|
}
|
|
|
|
|
|
#endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */
|