Mercurial > hg > nginx
comparison src/event/ngx_event_timer.c @ 195:8dee38ea9117
nginx-0.0.1-2003-11-25-23:44:56 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 25 Nov 2003 20:44:56 +0000 |
parents | e92c2c647c57 |
children | 4a9a2b1dd6fa |
comparison
equal
deleted
inserted
replaced
194:2357fa41738a | 195:8dee38ea9117 |
---|---|
6 | 6 |
7 /* TODO: in multithreaded enviroment all timer operations must be | 7 /* TODO: in multithreaded enviroment all timer operations must be |
8 protected by the single mutex */ | 8 protected by the single mutex */ |
9 | 9 |
10 | 10 |
11 #if 0 | |
11 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; | 12 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; |
13 static int ngx_expire_timers; | |
14 #endif | |
15 | |
16 static ngx_event_t *ngx_timer_queue; | |
17 static ngx_msec_t *ngx_timer_delta; | |
12 static int ngx_timer_cur_queue; | 18 static int ngx_timer_cur_queue; |
13 static int ngx_timer_queue_num; | 19 static int ngx_timer_queue_num; |
14 static int ngx_expire_timers; | |
15 | 20 |
16 | 21 |
17 int ngx_event_timer_init(ngx_cycle_t *cycle) | 22 int ngx_event_timer_init(ngx_cycle_t *cycle) |
18 { | 23 { |
19 int i; | 24 ngx_int_t i; |
25 ngx_msec_t *new_delta; | |
20 ngx_event_t *new_queue; | 26 ngx_event_t *new_queue; |
21 ngx_event_conf_t *ecf; | 27 ngx_event_conf_t *ecf; |
22 | 28 |
23 ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); | 29 ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); |
24 | 30 |
36 ngx_free(ngx_timer_queue); | 42 ngx_free(ngx_timer_queue); |
37 } | 43 } |
38 | 44 |
39 ngx_timer_queue = new_queue; | 45 ngx_timer_queue = new_queue; |
40 | 46 |
47 ngx_test_null(new_delta, | |
48 ngx_calloc(ecf->timer_queues * sizeof(ngx_msec_t), | |
49 cycle->log), | |
50 NGX_ERROR); | |
51 | |
52 for (i = 0; i < ngx_timer_queue_num; i++) { | |
53 new_delta[i] = ngx_timer_delta[i]; | |
54 } | |
55 | |
56 if (ngx_timer_delta) { | |
57 ngx_free(ngx_timer_delta); | |
58 } | |
59 | |
60 ngx_timer_delta = new_delta; | |
61 | |
41 ngx_timer_queue_num = ecf->timer_queues; | 62 ngx_timer_queue_num = ecf->timer_queues; |
42 ngx_timer_cur_queue = 0; | 63 ngx_timer_cur_queue = 0; |
43 | 64 |
44 for (/* void */; i < ngx_timer_queue_num; i++) { | 65 for (/* void */; i < ngx_timer_queue_num; i++) { |
45 ngx_timer_queue[i].timer_prev = &ngx_timer_queue[i]; | 66 ngx_timer_queue[i].timer_prev = &ngx_timer_queue[i]; |
50 /* STUB */ | 71 /* STUB */ |
51 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); | 72 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); |
52 exit(1); | 73 exit(1); |
53 } | 74 } |
54 | 75 |
76 #if 0 | |
55 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; | 77 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; |
56 ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; | 78 ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; |
79 #endif | |
57 | 80 |
58 return NGX_OK;; | 81 return NGX_OK;; |
59 } | 82 } |
60 | 83 |
61 | 84 |
62 void ngx_event_timer_done(ngx_cycle_t *cycle) | 85 void ngx_event_timer_done(ngx_cycle_t *cycle) |
63 { | 86 { |
64 ngx_free(ngx_timer_queue); | 87 ngx_free(ngx_timer_queue); |
65 ngx_timer_queue = NULL; | 88 ngx_timer_queue = NULL; |
89 | |
90 ngx_free(ngx_timer_delta); | |
91 ngx_timer_delta = NULL; | |
92 | |
66 ngx_timer_queue_num = 0; | 93 ngx_timer_queue_num = 0; |
67 } | 94 } |
68 | 95 |
69 | 96 |
70 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) | 97 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) |
87 if (ev->timer_next || ev->timer_prev) { | 114 if (ev->timer_next || ev->timer_prev) { |
88 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | 115 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); |
89 return; | 116 return; |
90 } | 117 } |
91 | 118 |
119 queue = &ngx_timer_queue[ngx_timer_cur_queue]; | |
120 timer += ngx_timer_delta[ngx_timer_cur_queue++]; | |
121 | |
122 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | |
123 ngx_timer_cur_queue = 0; | |
124 } | |
125 | |
126 | |
127 #if 0 | |
92 if (ngx_expire_timers) { | 128 if (ngx_expire_timers) { |
93 queue = &ngx_temp_timer_queue; | 129 queue = &ngx_temp_timer_queue; |
94 | 130 |
95 } else { | 131 } else { |
96 queue = &ngx_timer_queue[ngx_timer_cur_queue++]; | 132 queue = &ngx_timer_queue[ngx_timer_cur_queue++]; |
97 | 133 |
98 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | 134 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { |
99 ngx_timer_cur_queue = 0; | 135 ngx_timer_cur_queue = 0; |
100 } | 136 } |
101 } | 137 } |
138 #endif | |
102 | 139 |
103 for (e = queue->timer_next; | 140 for (e = queue->timer_next; |
104 e != queue && timer > e->timer_delta; | 141 e != queue && timer > e->timer_delta; |
105 e = e->timer_next) | 142 e = e->timer_next) |
106 { | 143 { |
121 } | 158 } |
122 | 159 |
123 | 160 |
124 int ngx_event_find_timer(void) | 161 int ngx_event_find_timer(void) |
125 { | 162 { |
126 int i; | 163 ngx_int_t i; |
127 ngx_msec_t timer; | 164 ngx_msec_t timer; |
128 | 165 |
129 timer = NGX_MAX_MSEC; | 166 timer = NGX_MAX_MSEC; |
130 | 167 |
131 for (i = 0; i < ngx_timer_queue_num; i++) { | 168 for (i = 0; i < ngx_timer_queue_num; i++) { |
144 | 181 |
145 return timer; | 182 return timer; |
146 } | 183 } |
147 | 184 |
148 | 185 |
186 void ngx_event_set_timer_delta(ngx_msec_t timer) | |
187 { | |
188 ngx_int_t i; | |
189 | |
190 for (i = 0; i < ngx_timer_queue_num; i++) { | |
191 ngx_timer_delta[i] = timer; | |
192 } | |
193 } | |
194 | |
195 | |
196 /* void ngx_event_expire_timers() */ | |
149 void ngx_event_expire_timers(ngx_msec_t timer) | 197 void ngx_event_expire_timers(ngx_msec_t timer) |
150 { | 198 { |
151 int i; | 199 ngx_int_t i; |
200 #if 0 | |
152 ngx_msec_t delta; | 201 ngx_msec_t delta; |
202 #endif | |
153 ngx_event_t *ev; | 203 ngx_event_t *ev; |
154 | 204 |
205 #if 0 | |
155 ngx_expire_timers = 1; | 206 ngx_expire_timers = 1; |
207 #endif | |
156 | 208 |
157 for (i = 0; i < ngx_timer_queue_num; i++) { | 209 for (i = 0; i < ngx_timer_queue_num; i++) { |
158 | 210 |
211 #if 0 | |
159 delta = timer; | 212 delta = timer; |
213 #endif | |
160 | 214 |
161 for ( ;; ) { | 215 for ( ;; ) { |
162 ev = ngx_timer_queue[i].timer_next; | 216 ev = ngx_timer_queue[i].timer_next; |
163 | 217 |
164 if (ev == &ngx_timer_queue[i]) { | 218 if (ev == &ngx_timer_queue[i]) { |
165 break; | 219 break; |
166 } | 220 } |
167 | 221 |
222 if (ev->timer_delta > ngx_timer_delta[i]) { | |
223 ev->timer_delta -= ngx_timer_delta[i]; | |
224 break; | |
225 } | |
226 | |
227 ngx_timer_delta[i] -= ev->timer_delta; | |
228 | |
229 #if 0 | |
168 if (ev->timer_delta > delta) { | 230 if (ev->timer_delta > delta) { |
169 ev->timer_delta -= delta; | 231 ev->timer_delta -= delta; |
170 break; | 232 break; |
171 } | 233 } |
172 | 234 |
173 delta -= ev->timer_delta; | 235 delta -= ev->timer_delta; |
236 #endif | |
174 | 237 |
175 ngx_del_timer(ev); | 238 ngx_del_timer(ev); |
176 | 239 |
177 if (ev->delayed) { | 240 if (ev->delayed) { |
178 ev->delayed = 0; | 241 ev->delayed = 0; |
184 ev->timedout = 1; | 247 ev->timedout = 1; |
185 } | 248 } |
186 | 249 |
187 ev->event_handler(ev); | 250 ev->event_handler(ev); |
188 } | 251 } |
189 } | 252 |
190 | 253 ngx_timer_delta[i] = 0; |
254 } | |
255 | |
256 #if 0 | |
191 ngx_expire_timers = 0; | 257 ngx_expire_timers = 0; |
192 | 258 |
193 if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { | 259 if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { |
194 return; | 260 return; |
195 } | 261 } |
205 #endif | 271 #endif |
206 | 272 |
207 ngx_del_timer(ev); | 273 ngx_del_timer(ev); |
208 ngx_add_timer(ev, timer); | 274 ngx_add_timer(ev, timer); |
209 } | 275 } |
210 } | 276 #endif |
277 } |