Mercurial > hg > nginx
comparison src/event/ngx_event_timer.c @ 114:ac69ab96328d
nginx-0.0.1-2003-07-07-10:11:50 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 07 Jul 2003 06:11:50 +0000 |
parents | d7f606e25b99 |
children | cd54bcbaf3b5 |
comparison
equal
deleted
inserted
replaced
113:d7f606e25b99 | 114:ac69ab96328d |
---|---|
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 | 5 |
6 | 6 |
7 static ngx_event_t *ngx_timer_queue; | 7 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; |
8 static int ngx_timer_cur_queue; | 8 static int ngx_timer_cur_queue; |
9 static int ngx_timer_queue_num; | 9 static int ngx_timer_queue_num; |
10 static int ngx_expire_timers; | |
10 | 11 |
11 | 12 |
12 int ngx_event_timer_init(ngx_cycle_t *cycle) | 13 int ngx_event_timer_init(ngx_cycle_t *cycle) |
13 { | 14 { |
14 int i; | 15 int i; |
41 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i]; | 42 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i]; |
42 } | 43 } |
43 | 44 |
44 } else if (ngx_timer_queue_num > ecf->timer_queues) { | 45 } else if (ngx_timer_queue_num > ecf->timer_queues) { |
45 /* STUB */ | 46 /* STUB */ |
46 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY"); | 47 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); |
47 exit(1); | 48 exit(1); |
48 } | 49 } |
50 | |
51 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; | |
52 ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; | |
49 | 53 |
50 return NGX_OK;; | 54 return NGX_OK;; |
51 } | 55 } |
52 | 56 |
53 | 57 |
59 } | 63 } |
60 | 64 |
61 | 65 |
62 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) | 66 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) |
63 { | 67 { |
64 ngx_event_t *e; | 68 ngx_event_t *e, *queue; |
65 | 69 |
66 #if (NGX_DEBUG_EVENT) | 70 #if (NGX_DEBUG_EVENT) |
67 ngx_connection_t *c = ev->data; | 71 ngx_connection_t *c = ev->data; |
68 ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _ | 72 ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _ |
69 c->fd _ timer _ ngx_timer_cur_queue); | 73 c->fd _ timer _ ngx_timer_cur_queue); |
72 if (ev->timer_next || ev->timer_prev) { | 76 if (ev->timer_next || ev->timer_prev) { |
73 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | 77 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); |
74 return; | 78 return; |
75 } | 79 } |
76 | 80 |
77 for (e = ngx_timer_queue[ngx_timer_cur_queue].timer_next; | 81 if (ngx_expire_timers) { |
78 e != &ngx_timer_queue[ngx_timer_cur_queue] && timer > e->timer_delta; | 82 queue = &ngx_temp_timer_queue; |
83 | |
84 } else { | |
85 queue = &ngx_timer_queue[ngx_timer_cur_queue++]; | |
86 | |
87 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | |
88 ngx_timer_cur_queue = 0; | |
89 } | |
90 } | |
91 | |
92 for (e = queue->timer_next; | |
93 e != queue && timer > e->timer_delta; | |
79 e = e->timer_next) | 94 e = e->timer_next) |
80 { | 95 { |
81 timer -= e->timer_delta; | 96 timer -= e->timer_delta; |
82 } | |
83 | |
84 ngx_timer_cur_queue++; | |
85 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | |
86 ngx_timer_cur_queue = 0; | |
87 } | 97 } |
88 | 98 |
89 ev->timer_delta = timer; | 99 ev->timer_delta = timer; |
90 | 100 |
91 ev->timer_next = e; | 101 ev->timer_next = e; |
125 { | 135 { |
126 int i; | 136 int i; |
127 ngx_msec_t delta; | 137 ngx_msec_t delta; |
128 ngx_event_t *ev; | 138 ngx_event_t *ev; |
129 | 139 |
140 ngx_expire_timers = 1; | |
141 | |
130 for (i = 0; i < ngx_timer_queue_num; i++) { | 142 for (i = 0; i < ngx_timer_queue_num; i++) { |
131 | 143 |
132 delta = timer; | 144 delta = timer; |
133 | 145 |
134 for ( ;; ) { | 146 for ( ;; ) { |
159 } | 171 } |
160 | 172 |
161 ev->event_handler(ev); | 173 ev->event_handler(ev); |
162 } | 174 } |
163 } | 175 } |
176 | |
177 ngx_expire_timers = 0; | |
178 | |
179 if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { | |
180 return; | |
181 } | |
182 | |
183 timer = 0; | |
184 | |
185 while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) { | |
186 timer += ngx_temp_timer_queue.timer_next->timer_delta; | |
187 ev = ngx_temp_timer_queue.timer_next; | |
188 | |
189 ngx_del_timer(ev); | |
190 ngx_add_timer(ev, timer); | |
191 } | |
164 } | 192 } |