Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_poll_module.c @ 305:4b1a3a4acc60
nginx-0.0.3-2004-04-02-19:13:20 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 02 Apr 2004 15:13:20 +0000 |
parents | bdd631bf1a1c |
children | 98f1a8028067 |
comparison
equal
deleted
inserted
replaced
304:bcbe876f4262 | 305:4b1a3a4acc60 |
---|---|
11 | 11 |
12 static int ngx_poll_init(ngx_cycle_t *cycle); | 12 static int ngx_poll_init(ngx_cycle_t *cycle); |
13 static void ngx_poll_done(ngx_cycle_t *cycle); | 13 static void ngx_poll_done(ngx_cycle_t *cycle); |
14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); | 14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); |
15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); | 15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); |
16 int ngx_poll_process_events(ngx_log_t *log); | 16 int ngx_poll_process_events(ngx_cycle_t *cycle); |
17 | 17 |
18 | 18 |
19 static struct pollfd *event_list; | 19 static struct pollfd *event_list; |
20 static int nevents; | 20 static int nevents; |
21 | 21 |
47 NGX_MODULE, | 47 NGX_MODULE, |
48 &ngx_poll_module_ctx, /* module context */ | 48 &ngx_poll_module_ctx, /* module context */ |
49 NULL, /* module directives */ | 49 NULL, /* module directives */ |
50 NGX_EVENT_MODULE, /* module type */ | 50 NGX_EVENT_MODULE, /* module type */ |
51 NULL, /* init module */ | 51 NULL, /* init module */ |
52 NULL /* init child */ | 52 NULL /* init process */ |
53 }; | 53 }; |
54 | 54 |
55 | 55 |
56 | 56 |
57 static int ngx_poll_init(ngx_cycle_t *cycle) | 57 static int ngx_poll_init(ngx_cycle_t *cycle) |
159 } | 159 } |
160 | 160 |
161 | 161 |
162 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) | 162 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) |
163 { | 163 { |
164 ngx_int_t i; | 164 ngx_uint_t i; |
165 ngx_cycle_t **cycle; | 165 ngx_cycle_t **cycle; |
166 ngx_event_t *e; | 166 ngx_event_t *e; |
167 ngx_connection_t *c; | 167 ngx_connection_t *c; |
168 | 168 |
169 c = ev->data; | 169 c = ev->data; |
243 | 243 |
244 return NGX_OK; | 244 return NGX_OK; |
245 } | 245 } |
246 | 246 |
247 | 247 |
248 int ngx_poll_process_events(ngx_log_t *log) | 248 int ngx_poll_process_events(ngx_cycle_t *cycle) |
249 { | 249 { |
250 int ready; | 250 int ready; |
251 ngx_int_t i, j, nready, found; | 251 ngx_int_t i, nready; |
252 ngx_uint_t n, found; | |
252 ngx_msec_t timer; | 253 ngx_msec_t timer; |
253 ngx_err_t err; | 254 ngx_err_t err; |
254 ngx_cycle_t **cycle; | 255 ngx_cycle_t **old_cycle; |
255 ngx_event_t *ev; | 256 ngx_event_t *ev; |
256 ngx_epoch_msec_t delta; | 257 ngx_epoch_msec_t delta; |
257 ngx_connection_t *c; | 258 ngx_connection_t *c; |
258 struct timeval tv; | 259 struct timeval tv; |
259 | 260 |
270 | 271 |
271 ngx_old_elapsed_msec = ngx_elapsed_msec; | 272 ngx_old_elapsed_msec = ngx_elapsed_msec; |
272 | 273 |
273 #if (NGX_DEBUG0) | 274 #if (NGX_DEBUG0) |
274 for (i = 0; i < nevents; i++) { | 275 for (i = 0; i < nevents; i++) { |
275 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", | 276 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
277 "poll: %d: fd:%d ev:%04X", | |
276 i, event_list[i].fd, event_list[i].events); | 278 i, event_list[i].fd, event_list[i].events); |
277 } | 279 } |
278 | 280 |
279 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll timer: %d", timer); | 281 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %d", timer); |
280 #endif | 282 #endif |
281 | 283 |
282 ready = poll(event_list, (u_int) nevents, (int) timer); | 284 ready = poll(event_list, (u_int) nevents, (int) timer); |
283 | 285 |
284 if (ready == -1) { | 286 if (ready == -1) { |
291 ngx_time_update(tv.tv_sec); | 293 ngx_time_update(tv.tv_sec); |
292 | 294 |
293 delta = ngx_elapsed_msec; | 295 delta = ngx_elapsed_msec; |
294 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; | 296 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; |
295 | 297 |
296 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, | 298 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
297 "poll ready %d of %d", ready, nevents); | 299 "poll ready %d of %d", ready, nevents); |
298 | 300 |
299 if (err) { | 301 if (err) { |
300 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 302 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
301 log, err, "poll() failed"); | 303 cycle->log, err, "poll() failed"); |
302 return NGX_ERROR; | 304 return NGX_ERROR; |
303 } | 305 } |
304 | 306 |
305 if (timer != (ngx_msec_t) INFTIM) { | 307 if (timer != (ngx_msec_t) INFTIM) { |
306 delta = ngx_elapsed_msec - delta; | 308 delta = ngx_elapsed_msec - delta; |
307 | 309 |
308 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, | 310 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
309 "poll timer: %d, delta: %d", timer, (int) delta); | 311 "poll timer: %d, delta: %d", timer, (int) delta); |
310 } else { | 312 } else { |
311 if (ready == 0) { | 313 if (ready == 0) { |
312 ngx_log_error(NGX_LOG_ALERT, log, 0, | 314 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
313 "poll() returned no events without timeout"); | 315 "poll() returned no events without timeout"); |
314 return NGX_ERROR; | 316 return NGX_ERROR; |
315 } | 317 } |
316 } | 318 } |
317 | 319 |
323 nready = 0; | 325 nready = 0; |
324 | 326 |
325 for (i = 0; i < nevents && ready; i++) { | 327 for (i = 0; i < nevents && ready; i++) { |
326 | 328 |
327 #if 0 | 329 #if 0 |
328 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, | 330 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
329 "poll: %d: fd:%d ev:%04X rev:%04X", | 331 "poll: %d: fd:%d ev:%04X rev:%04X", |
330 i, event_list[i].fd, | 332 i, event_list[i].fd, |
331 event_list[i].events, event_list[i].revents); | 333 event_list[i].events, event_list[i].revents); |
332 #else | 334 #else |
333 if (event_list[i].revents) { | 335 if (event_list[i].revents) { |
334 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, | 336 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
335 "poll: %d: fd:%d ev:%04X rev:%04X", | 337 "poll: %d: fd:%d ev:%04X rev:%04X", |
336 i, event_list[i].fd, | 338 i, event_list[i].fd, |
337 event_list[i].events, event_list[i].revents); | 339 event_list[i].events, event_list[i].revents); |
338 } | 340 } |
339 #endif | 341 #endif |
340 | 342 |
341 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { | 343 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { |
342 ngx_log_error(NGX_LOG_ALERT, log, 0, | 344 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
343 "poll() error fd:%d ev:%04X rev:%04X", | 345 "poll() error fd:%d ev:%04X rev:%04X", |
344 event_list[i].fd, | 346 event_list[i].fd, |
345 event_list[i].events, event_list[i].revents); | 347 event_list[i].events, event_list[i].revents); |
346 } | 348 } |
347 | 349 |
348 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) | 350 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) |
349 { | 351 { |
350 ngx_log_error(NGX_LOG_ALERT, log, 0, | 352 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
351 "strange poll() events fd:%d ev:%04X rev:%04X", | 353 "strange poll() events fd:%d ev:%04X rev:%04X", |
352 event_list[i].fd, | 354 event_list[i].fd, |
353 event_list[i].events, event_list[i].revents); | 355 event_list[i].events, event_list[i].revents); |
354 } | 356 } |
355 | 357 |
361 } | 363 } |
362 | 364 |
363 c = &ngx_cycle->connections[event_list[i].fd]; | 365 c = &ngx_cycle->connections[event_list[i].fd]; |
364 | 366 |
365 if (c->fd == -1) { | 367 if (c->fd == -1) { |
366 cycle = ngx_old_cycles.elts; | 368 old_cycle = ngx_old_cycles.elts; |
367 for (j = 0; j < ngx_old_cycles.nelts; j++) { | 369 for (n = 0; n < ngx_old_cycles.nelts; n++) { |
368 if (cycle[j] == NULL) { | 370 if (old_cycle[n] == NULL) { |
369 continue; | 371 continue; |
370 } | 372 } |
371 c = &cycle[j]->connections[event_list[i].fd]; | 373 c = &old_cycle[n]->connections[event_list[i].fd]; |
372 if (c->fd != -1) { | 374 if (c->fd != -1) { |
373 break; | 375 break; |
374 } | 376 } |
375 } | 377 } |
376 } | 378 } |
377 | 379 |
378 if (c->fd == -1) { | 380 if (c->fd == -1) { |
379 ngx_log_error(NGX_LOG_ALERT, log, 0, "unexpected event"); | 381 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event"); |
380 | 382 |
381 /* | 383 /* |
382 * it is certainly our fault and it should be investigated, | 384 * it is certainly our fault and it should be investigated, |
383 * in the meantime we disable this event to avoid a CPU spinning | 385 * in the meantime we disable this event to avoid a CPU spinning |
384 */ | 386 */ |
433 | 435 |
434 ev->event_handler(ev); | 436 ev->event_handler(ev); |
435 } | 437 } |
436 | 438 |
437 if (ready != 0) { | 439 if (ready != 0) { |
438 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); | 440 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events"); |
439 } | 441 } |
440 | 442 |
441 if (timer != (ngx_msec_t) INFTIM && delta) { | 443 if (timer != (ngx_msec_t) INFTIM && delta) { |
442 ngx_event_expire_timers((ngx_msec_t) delta); | 444 ngx_event_expire_timers((ngx_msec_t) delta); |
443 } | 445 } |