comparison src/event/ngx_event_timer.h @ 106:45f7329b4bd0 NGINX_0_3_0

nginx 0.3.0 *) Change: the 10-days live time limit of worker process was eliminated. The limit was introduced because of millisecond timers overflow.
author Igor Sysoev <http://sysoev.ru>
date Fri, 07 Oct 2005 00:00:00 +0400
parents 72eb30262aac
children cf3d6edb3ad6
comparison
equal deleted inserted replaced
105:531d62c2a28d 106:45f7329b4bd0
14 14
15 15
16 #define NGX_TIMER_INFINITE (ngx_msec_t) -1 16 #define NGX_TIMER_INFINITE (ngx_msec_t) -1
17 #define NGX_TIMER_ERROR (ngx_msec_t) -2 17 #define NGX_TIMER_ERROR (ngx_msec_t) -2
18 18
19
20 /*
21 * the 32-bit timer key value resolution
22 *
23 * 1 msec - 24 days
24 * 10 msec - 8 months
25 * 50 msec - 3 years 5 months
26 * 100 msec - 6 years 10 months
27 */
28
29 #define NGX_TIMER_RESOLUTION 1
30
31 #define NGX_TIMER_LAZY_DELAY 300 19 #define NGX_TIMER_LAZY_DELAY 300
32 20
33 21
34 ngx_int_t ngx_event_timer_init(ngx_log_t *log); 22 ngx_int_t ngx_event_timer_init(ngx_log_t *log);
35 ngx_msec_t ngx_event_find_timer(void); 23 ngx_msec_t ngx_event_find_timer(void);
36 void ngx_event_expire_timers(ngx_msec_t timer); 24 void ngx_event_expire_timers(void);
37 25
38 26
39 #if (NGX_THREADS) 27 #if (NGX_THREADS)
40 extern ngx_mutex_t *ngx_event_timer_mutex; 28 extern ngx_mutex_t *ngx_event_timer_mutex;
41 #endif 29 #endif
47 35
48 static ngx_inline void 36 static ngx_inline void
49 ngx_event_del_timer(ngx_event_t *ev) 37 ngx_event_del_timer(ngx_event_t *ev)
50 { 38 {
51 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 39 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
52 "event timer del: %d: %d", 40 "event timer del: %d: %M",
53 ngx_event_ident(ev->data), ev->rbtree_key); 41 ngx_event_ident(ev->data), ev->rbtree_key);
54 42
55 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) { 43 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
56 return; 44 return;
57 } 45 }
73 61
74 62
75 static ngx_inline void 63 static ngx_inline void
76 ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) 64 ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
77 { 65 {
78 ngx_int_t key; 66 ngx_rbtree_key_t key;
67 ngx_rbtree_key_int_t diff;
79 68
80 key = (ngx_int_t) 69 key = ngx_current_time + timer;
81 (ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION
82 + timer) / NGX_TIMER_RESOLUTION;
83 #if 0
84 (ngx_elapsed_msec + timer) / NGX_TIMER_RESOLUTION;
85 #endif
86 70
87 if (ev->timer_set) { 71 if (ev->timer_set) {
88 72
89 /* 73 /*
90 * Use the previous timer value if a difference between them is less 74 * Use the previous timer value if a difference between them is less
91 * then NGX_TIMER_LAZY_DELAY milliseconds. It allows to minimize 75 * then NGX_TIMER_LAZY_DELAY milliseconds. It allows to minimize
92 * the rbtree operations for the fast connections. 76 * the rbtree operations for the fast connections.
93 */ 77 */
94 78
95 if (abs(key - ev->rbtree_key) 79 diff = (ngx_rbtree_key_int_t) (key - ev->rbtree_key);
96 < NGX_TIMER_LAZY_DELAY / NGX_TIMER_RESOLUTION) 80
97 { 81 if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) {
98 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, 82 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
99 "event timer: %d, old: %i, new: %i", 83 "event timer: %d, old: %M, new: %M",
100 ngx_event_ident(ev->data), ev->rbtree_key, key); 84 ngx_event_ident(ev->data), ev->rbtree_key, key);
101 return; 85 return;
102 } 86 }
103 87
104 ngx_del_timer(ev); 88 ngx_del_timer(ev);
105 } 89 }
106 90
107 ev->rbtree_key = key; 91 ev->rbtree_key = key;
108 92
109 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 93 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
110 "event timer add: %d: %i", 94 "event timer add: %d: %M:%M",
111 ngx_event_ident(ev->data), ev->rbtree_key); 95 ngx_event_ident(ev->data), timer, ev->rbtree_key);
112 96
113 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) { 97 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
114 return; 98 return;
115 } 99 }
116 100