Mercurial > hg > nginx-vendor-0-6
comparison src/event/ngx_event_timer.h @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | 46833bd150cb |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f0b350454894 |
---|---|
1 | |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #ifndef _NGX_EVENT_TIMER_H_INCLUDED_ | |
8 #define _NGX_EVENT_TIMER_H_INCLUDED_ | |
9 | |
10 | |
11 #include <ngx_config.h> | |
12 #include <ngx_core.h> | |
13 #include <ngx_event.h> | |
14 | |
15 | |
16 #define NGX_TIMER_INFINITE -1 | |
17 #define NGX_TIMER_ERROR -2 | |
18 | |
19 /* | |
20 * 32 bit timer key value resolution | |
21 * | |
22 * 1 msec - 24 days | |
23 * 10 msec - 8 months | |
24 * 50 msec - 3 years 5 months | |
25 * 100 msec - 6 years 10 months | |
26 */ | |
27 | |
28 #define NGX_TIMER_RESOLUTION 1 | |
29 | |
30 | |
31 ngx_int_t ngx_event_timer_init(ngx_log_t *log); | |
32 ngx_msec_t ngx_event_find_timer(void); | |
33 void ngx_event_expire_timers(ngx_msec_t timer); | |
34 | |
35 | |
36 #if (NGX_THREADS) | |
37 extern ngx_mutex_t *ngx_event_timer_mutex; | |
38 #endif | |
39 | |
40 | |
41 extern ngx_thread_volatile ngx_rbtree_t *ngx_event_timer_rbtree; | |
42 extern ngx_rbtree_t ngx_event_timer_sentinel; | |
43 | |
44 | |
45 ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) | |
46 { | |
47 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
48 "event timer del: %d: %d", | |
49 ngx_event_ident(ev->data), ev->rbtree_key); | |
50 | |
51 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) { | |
52 return; | |
53 } | |
54 | |
55 ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree, | |
56 &ngx_event_timer_sentinel, | |
57 (ngx_rbtree_t *) &ev->rbtree_key); | |
58 | |
59 ngx_mutex_unlock(ngx_event_timer_mutex); | |
60 | |
61 #if (NGX_DEBUG) | |
62 ev->rbtree_left = NULL; | |
63 ev->rbtree_right = NULL; | |
64 ev->rbtree_parent = NULL; | |
65 #endif | |
66 | |
67 ev->timer_set = 0; | |
68 } | |
69 | |
70 | |
71 ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) | |
72 { | |
73 ngx_int_t key; | |
74 | |
75 key = (ngx_int_t) | |
76 (ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION | |
77 + timer) / NGX_TIMER_RESOLUTION; | |
78 #if 0 | |
79 (ngx_elapsed_msec + timer) / NGX_TIMER_RESOLUTION; | |
80 #endif | |
81 | |
82 if (ev->timer_set) { | |
83 | |
84 /* | |
85 * Use the previous timer value if a difference between them is less | |
86 * then 100 milliseconds. It allows to minimize the rbtree operations | |
87 * for the fast connections. | |
88 */ | |
89 | |
90 if (abs(key - ev->rbtree_key) < 100 / NGX_TIMER_RESOLUTION) { | |
91 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
92 "event timer: %d, old: %d, new: %d", | |
93 ngx_event_ident(ev->data), ev->rbtree_key, key); | |
94 return; | |
95 } | |
96 | |
97 ngx_del_timer(ev); | |
98 } | |
99 | |
100 ev->rbtree_key = key; | |
101 | |
102 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
103 "event timer add: %d: %d", | |
104 ngx_event_ident(ev->data), ev->rbtree_key); | |
105 | |
106 if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) { | |
107 return; | |
108 } | |
109 | |
110 ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree, | |
111 &ngx_event_timer_sentinel, | |
112 (ngx_rbtree_t *) &ev->rbtree_key); | |
113 | |
114 ngx_mutex_unlock(ngx_event_timer_mutex); | |
115 | |
116 ev->timer_set = 1; | |
117 } | |
118 | |
119 | |
120 #endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */ |