Mercurial > hg > nginx
comparison src/event/modules/ngx_select_module.c @ 53:d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 26 Jan 2003 21:08:14 +0000 |
parents | b288069a8696 |
children | e8cdc2989cee |
comparison
equal
deleted
inserted
replaced
52:9f2728644651 | 53:d1e42f1b8fd4 |
---|---|
21 static int max_write; | 21 static int max_write; |
22 #else | 22 #else |
23 static int max_fd; | 23 static int max_fd; |
24 #endif | 24 #endif |
25 | 25 |
26 static u_int nevents; | 26 static int nevents; |
27 | 27 |
28 static ngx_event_t **event_index; | 28 static ngx_event_t **event_index; |
29 static ngx_event_t **ready_index; | 29 static ngx_event_t **ready_index; |
30 static ngx_event_t timer_queue; | 30 static ngx_event_t *timer_queue; |
31 /* */ | 31 /* */ |
32 | 32 |
33 int ngx_select_init(int max_connections, ngx_log_t *log) | 33 int ngx_select_init(int max_connections, ngx_log_t *log) |
34 { | 34 { |
35 if (max_connections > FD_SETSIZE) { | 35 if (max_connections > FD_SETSIZE) { |
55 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), | 55 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), |
56 NGX_ERROR); | 56 NGX_ERROR); |
57 | 57 |
58 nevents = 0; | 58 nevents = 0; |
59 | 59 |
60 timer_queue.timer_prev = &timer_queue; | 60 timer_queue = ngx_event_init_timer(log); |
61 timer_queue.timer_next = &timer_queue; | 61 if (timer_queue == NULL) { |
62 return NGX_ERROR; | |
63 } | |
62 | 64 |
63 ngx_event_actions.add = ngx_select_add_event; | 65 ngx_event_actions.add = ngx_select_add_event; |
64 ngx_event_actions.del = ngx_select_del_event; | 66 ngx_event_actions.del = ngx_select_del_event; |
65 ngx_event_actions.timer = ngx_select_add_timer; | 67 ngx_event_actions.timer = ngx_event_add_timer; |
66 ngx_event_actions.process = ngx_select_process_events; | 68 ngx_event_actions.process = ngx_select_process_events; |
67 | 69 |
68 #if (WIN32) | 70 #if (WIN32) |
69 max_read = max_write = 0; | 71 max_read = max_write = 0; |
70 #else | 72 #else |
174 } | 176 } |
175 | 177 |
176 int ngx_select_process_events(ngx_log_t *log) | 178 int ngx_select_process_events(ngx_log_t *log) |
177 { | 179 { |
178 int ready, found, nready; | 180 int ready, found, nready; |
179 u_int i, timer, delta; | 181 u_int i; |
182 ngx_msec_t timer, delta; | |
180 ngx_event_t *ev; | 183 ngx_event_t *ev; |
181 ngx_connection_t *c; | 184 ngx_connection_t *c; |
182 struct timeval tv, *tp; | 185 struct timeval tv, *tp; |
183 | 186 |
184 work_read_fd_set = master_read_fd_set; | 187 work_read_fd_set = master_read_fd_set; |
185 work_write_fd_set = master_write_fd_set; | 188 work_write_fd_set = master_write_fd_set; |
186 | 189 |
187 if (timer_queue.timer_next != &timer_queue) { | 190 timer = ngx_event_find_timer(); |
188 timer = timer_queue.timer_next->timer_delta; | 191 |
192 if (timer) { | |
189 tv.tv_sec = timer / 1000; | 193 tv.tv_sec = timer / 1000; |
190 tv.tv_usec = (timer % 1000) * 1000; | 194 tv.tv_usec = (timer % 1000) * 1000; |
191 tp = &tv; | 195 tp = &tv; |
192 | |
193 delta = ngx_msec(); | 196 delta = ngx_msec(); |
194 | 197 |
195 } else { | 198 } else { |
196 timer = 0; | 199 timer = 0; |
197 tp = NULL; | 200 tp = NULL; |
307 | 310 |
308 if (ready != 0) { | 311 if (ready != 0) { |
309 ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events"); | 312 ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events"); |
310 } | 313 } |
311 | 314 |
312 if (timer && timer_queue.timer_next != &timer_queue) { | 315 if (timer) { |
313 if (delta >= timer_queue.timer_next->timer_delta) { | 316 ngx_event_expire_timers(delta); |
314 for ( ;; ) { | |
315 ev = timer_queue.timer_next; | |
316 | |
317 if (ev == &timer_queue || delta < ev->timer_delta) { | |
318 break; | |
319 } | |
320 | |
321 delta -= ev->timer_delta; | |
322 | |
323 ngx_del_timer(ev); | |
324 ev->timedout = 1; | |
325 if (ev->event_handler(ev) == NGX_ERROR) { | |
326 ev->close_handler(ev); | |
327 } | |
328 } | |
329 | |
330 } else { | |
331 timer_queue.timer_next->timer_delta -= delta; | |
332 } | |
333 } | 317 } |
334 | 318 |
335 return NGX_OK; | 319 return NGX_OK; |
336 } | 320 } |
337 | |
338 void ngx_select_add_timer(ngx_event_t *ev, ngx_msec_t timer) | |
339 { | |
340 ngx_event_t *e; | |
341 | |
342 #if (NGX_DEBUG_EVENT) | |
343 ngx_connection_t *c = (ngx_connection_t *) ev->data; | |
344 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer); | |
345 #endif | |
346 | |
347 if (ev->timer_next || ev->timer_prev) { | |
348 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | |
349 return; | |
350 } | |
351 | |
352 for (e = timer_queue.timer_next; | |
353 e != &timer_queue && timer > e->timer_delta; | |
354 e = e->timer_next) | |
355 { | |
356 timer -= e->timer_delta; | |
357 } | |
358 | |
359 ev->timer_delta = timer; | |
360 | |
361 ev->timer_next = e; | |
362 ev->timer_prev = e->timer_prev; | |
363 | |
364 e->timer_prev->timer_next = ev; | |
365 e->timer_prev = ev; | |
366 } |