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 }