Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_select_module.c @ 39:83fa61cd3d2f
nginx-0.0.1-2002-12-24-20:30:59 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 24 Dec 2002 17:30:59 +0000 |
parents | 2ffaa35fba42 |
children | d5d4f3bba6f0 |
comparison
equal
deleted
inserted
replaced
38:2ffaa35fba42 | 39:83fa61cd3d2f |
---|---|
20 static int max_write; | 20 static int max_write; |
21 #else | 21 #else |
22 static int max_fd; | 22 static int max_fd; |
23 #endif | 23 #endif |
24 | 24 |
25 static int nevents; | 25 static unsigned int nevents; |
26 | 26 |
27 static ngx_event_t **event_index; | 27 static ngx_event_t **event_index; |
28 static ngx_event_t **ready_index; | 28 static ngx_event_t **ready_index; |
29 static ngx_event_t timer_queue; | 29 static ngx_event_t timer_queue; |
30 /* */ | 30 /* */ |
73 return NGX_OK; | 73 return NGX_OK; |
74 } | 74 } |
75 | 75 |
76 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) | 76 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) |
77 { | 77 { |
78 ngx_connection_t *c; | 78 ngx_connection_t *c; |
79 | 79 |
80 c = (ngx_connection_t *) ev->data; | 80 c = (ngx_connection_t *) ev->data; |
81 | 81 |
82 #if (NGX_DEBUG_EVENT) | |
82 ngx_log_debug(ev->log, "select fd:%d event:%d" _ c->fd _ event); | 83 ngx_log_debug(ev->log, "select fd:%d event:%d" _ c->fd _ event); |
84 #endif | |
83 | 85 |
84 if (ev->index != NGX_INVALID_INDEX) { | 86 if (ev->index != NGX_INVALID_INDEX) { |
85 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 87 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
86 "%d:%d is already set", c->fd, event); | 88 "%d:%d is already set", c->fd, event); |
87 return NGX_OK; | 89 return NGX_OK; |
115 if (max_fd != -1 && max_fd < c->fd) | 117 if (max_fd != -1 && max_fd < c->fd) |
116 max_fd = c->fd; | 118 max_fd = c->fd; |
117 | 119 |
118 #endif | 120 #endif |
119 | 121 |
122 ev->active = 1; | |
120 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; | 123 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; |
121 | 124 |
122 event_index[nevents] = ev; | 125 event_index[nevents] = ev; |
123 ev->index = nevents; | 126 ev->index = nevents; |
124 nevents++; | 127 nevents++; |
132 c = (ngx_connection_t *) ev->data; | 135 c = (ngx_connection_t *) ev->data; |
133 | 136 |
134 if (ev->index == NGX_INVALID_INDEX) | 137 if (ev->index == NGX_INVALID_INDEX) |
135 return NGX_OK; | 138 return NGX_OK; |
136 | 139 |
140 #if (NGX_DEBUG_EVENT) | |
137 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); | 141 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); |
142 #endif | |
138 | 143 |
139 #if (WIN32) | 144 #if (WIN32) |
140 if (event == NGX_READ_EVENT) { | 145 if (event == NGX_READ_EVENT) { |
141 FD_CLR(c->fd, &master_read_fd_set); | 146 FD_CLR(c->fd, &master_read_fd_set); |
142 max_read--; | 147 max_read--; |
159 if (ev->index < --nevents) { | 164 if (ev->index < --nevents) { |
160 event_index[ev->index] = event_index[nevents]; | 165 event_index[ev->index] = event_index[nevents]; |
161 event_index[ev->index]->index = ev->index; | 166 event_index[ev->index]->index = ev->index; |
162 } | 167 } |
163 | 168 |
169 ev->active = 0; | |
164 ev->index = NGX_INVALID_INDEX; | 170 ev->index = NGX_INVALID_INDEX; |
165 | 171 |
166 return NGX_OK; | 172 return NGX_OK; |
167 } | 173 } |
168 | 174 |
197 c = (ngx_connection_t *) event_index[i]->data; | 203 c = (ngx_connection_t *) event_index[i]->data; |
198 if (max_fd < c->fd) | 204 if (max_fd < c->fd) |
199 max_fd = c->fd; | 205 max_fd = c->fd; |
200 } | 206 } |
201 | 207 |
208 #if (NGX_DEBUG_EVENT) | |
202 ngx_log_debug(log, "change max_fd: %d" _ max_fd); | 209 ngx_log_debug(log, "change max_fd: %d" _ max_fd); |
203 } | 210 #endif |
204 #endif | 211 } |
205 | 212 #endif |
206 #if 1 | 213 |
207 /* DEBUG */ | 214 #if (NGX_DEBUG_EVENT) |
208 for (i = 0; i < nevents; i++) { | 215 for (i = 0; i < nevents; i++) { |
209 ev = event_index[i]; | 216 ev = event_index[i]; |
210 c = (ngx_connection_t *) ev->data; | 217 c = (ngx_connection_t *) ev->data; |
211 ngx_log_debug(log, "select: %d:%d" _ c->fd _ ev->write); | 218 ngx_log_debug(log, "select: %d:%d" _ c->fd _ ev->write); |
212 } | 219 } |
213 #endif | |
214 | 220 |
215 ngx_log_debug(log, "select timer: %d" _ timer); | 221 ngx_log_debug(log, "select timer: %d" _ timer); |
222 #endif | |
216 | 223 |
217 #if (WIN32) | 224 #if (WIN32) |
218 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp)) | 225 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp)) |
219 #else | 226 #else |
220 if ((ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, | 227 if ((ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, |
221 NULL, tp)) | 228 NULL, tp)) |
222 #endif | 229 #endif |
223 == -1) { | 230 == -1) |
231 { | |
224 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, "select() failed"); | 232 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, "select() failed"); |
225 return NGX_ERROR; | 233 return NGX_ERROR; |
226 } | 234 } |
227 | 235 |
236 #if (NGX_DEBUG_EVENT) | |
228 ngx_log_debug(log, "select ready %d" _ ready); | 237 ngx_log_debug(log, "select ready %d" _ ready); |
238 #endif | |
229 | 239 |
230 if (timer) { | 240 if (timer) { |
231 delta = ngx_msec() - delta; | 241 delta = ngx_msec() - delta; |
232 | 242 |
233 } else { | 243 } else { |
234 ngx_assert((ready != 0), return NGX_ERROR, log, | 244 if (ready == 0) { |
235 "select() returns no events without timeout"); | 245 ngx_log_error(NGX_LOG_ALERT, log, 0, |
236 } | 246 "select() returns no events without timeout"); |
237 | 247 return NGX_ERROR; |
248 } | |
249 } | |
250 | |
251 #if (NGX_DEBUG_EVENT) | |
238 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta); | 252 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta); |
239 | 253 #endif |
240 if (timer) { | |
241 if (delta >= timer) { | |
242 for ( ;; ) { | |
243 ev = timer_queue.timer_next; | |
244 | |
245 if (ev == &timer_queue || delta < ev->timer_delta) | |
246 break; | |
247 | |
248 delta -= ev->timer_delta; | |
249 ngx_del_timer(ev); | |
250 ev->timedout = 1; | |
251 if (ev->event_handler(ev) == NGX_ERROR) | |
252 ev->close_handler(ev); | |
253 } | |
254 | |
255 } else { | |
256 timer_queue.timer_next->timer_delta -= delta; | |
257 } | |
258 } | |
259 | 254 |
260 nready = 0; | 255 nready = 0; |
261 | 256 |
262 for (i = 0; i < nevents; i++) { | 257 for (i = 0; i < nevents; i++) { |
263 ev = event_index[i]; | 258 ev = event_index[i]; |
264 c = (ngx_connection_t *) ev->data; | 259 c = (ngx_connection_t *) ev->data; |
265 found = 0; | 260 found = 0; |
266 | 261 |
267 if (ev->write) { | 262 if (ev->write) { |
268 if (FD_ISSET(c->fd, &work_write_fd_set)) { | 263 if (FD_ISSET(c->fd, &work_write_fd_set)) { |
264 found = 1; | |
265 #if (NGX_DEBUG_EVENT) | |
269 ngx_log_debug(log, "select write %d" _ c->fd); | 266 ngx_log_debug(log, "select write %d" _ c->fd); |
270 found = 1; | 267 #endif |
271 } | 268 } |
272 | 269 |
273 } else { | 270 } else { |
274 if (FD_ISSET(c->fd, &work_read_fd_set)) { | 271 if (FD_ISSET(c->fd, &work_read_fd_set)) { |
272 found = 1; | |
273 #if (NGX_DEBUG_EVENT) | |
275 ngx_log_debug(log, "select read %d" _ c->fd); | 274 ngx_log_debug(log, "select read %d" _ c->fd); |
276 found = 1; | 275 #endif |
277 } | 276 } |
278 } | 277 } |
279 | 278 |
280 if (found) { | 279 if (found) { |
281 ready_index[nready++] = ev; | 280 ready_index[nready++] = ev; |
282 } | 281 } |
283 } | 282 } |
284 | 283 |
285 for (i = 0; i < nready; i++) { | 284 for (i = 0; i < nready; i++) { |
286 ev = ready_index[i]; | 285 ev = ready_index[i]; |
286 ready--; | |
287 | |
288 if (!ev->active) { | |
289 continue; | |
290 } | |
287 | 291 |
288 ev->ready = 1; | 292 ev->ready = 1; |
289 | 293 |
290 if (ev->oneshot) { | 294 if (ev->oneshot) { |
291 ngx_del_timer(ev); | 295 ngx_del_timer(ev); |
296 ngx_select_del_event(ev, NGX_READ_EVENT, 0); | 300 ngx_select_del_event(ev, NGX_READ_EVENT, 0); |
297 } | 301 } |
298 | 302 |
299 if (ev->event_handler(ev) == NGX_ERROR) | 303 if (ev->event_handler(ev) == NGX_ERROR) |
300 ev->close_handler(ev); | 304 ev->close_handler(ev); |
301 | 305 } |
302 ready--; | 306 |
303 } | 307 if (ready != 0) { |
304 | 308 ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events"); |
305 ngx_assert((ready == 0), /* void */ ; , log, "select ready != events"); | 309 } |
310 | |
311 if (timer && timer_queue.timer_next != &timer_queue) { | |
312 if (delta >= timer_queue.timer_next->timer_delta) { | |
313 for ( ;; ) { | |
314 ev = timer_queue.timer_next; | |
315 | |
316 if (ev == &timer_queue || delta < ev->timer_delta) { | |
317 break; | |
318 } | |
319 | |
320 delta -= ev->timer_delta; | |
321 | |
322 ngx_del_timer(ev); | |
323 ev->timedout = 1; | |
324 if (ev->event_handler(ev) == NGX_ERROR) { | |
325 ev->close_handler(ev); | |
326 } | |
327 } | |
328 | |
329 } else { | |
330 timer_queue.timer_next->timer_delta -= delta; | |
331 } | |
332 } | |
306 | 333 |
307 return NGX_OK; | 334 return NGX_OK; |
308 } | 335 } |
309 | 336 |
310 void ngx_select_add_timer(ngx_event_t *ev, ngx_msec_t timer) | 337 void ngx_select_add_timer(ngx_event_t *ev, ngx_msec_t timer) |
311 { | 338 { |
312 ngx_event_t *e; | 339 ngx_event_t *e; |
313 | 340 |
314 #if (NGX_DEBUG) | 341 #if (NGX_DEBUG_EVENT) |
315 ngx_connection_t *c = (ngx_connection_t *) ev->data; | 342 ngx_connection_t *c = (ngx_connection_t *) ev->data; |
316 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer); | 343 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer); |
317 #endif | 344 #endif |
318 ngx_assert((!ev->timer_next && !ev->timer_prev), return, ev->log, | 345 |
319 "timer already set"); | 346 if (ev->timer_next || ev->timer_prev) { |
347 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | |
348 return; | |
349 } | |
320 | 350 |
321 for (e = timer_queue.timer_next; | 351 for (e = timer_queue.timer_next; |
322 e != &timer_queue && timer > e->timer_delta; | 352 e != &timer_queue && timer > e->timer_delta; |
323 e = e->timer_next) | 353 e = e->timer_next) |
354 { | |
324 timer -= e->timer_delta; | 355 timer -= e->timer_delta; |
356 } | |
325 | 357 |
326 ev->timer_delta = timer; | 358 ev->timer_delta = timer; |
327 | 359 |
328 ev->timer_next = e; | 360 ev->timer_next = e; |
329 ev->timer_prev = e->timer_prev; | 361 ev->timer_prev = e->timer_prev; |