Mercurial > hg > nginx
comparison src/event/modules/ngx_rtsig_module.c @ 381:02a511569afb
nginx-0.0.7-2004-07-07-19:01:00 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 07 Jul 2004 15:01:00 +0000 |
parents | 5ce6561246a5 |
children | 449c4885dcd1 |
comparison
equal
deleted
inserted
replaced
380:5ce6561246a5 | 381:02a511569afb |
---|---|
156 | 156 |
157 ngx_io = ngx_os_io; | 157 ngx_io = ngx_os_io; |
158 | 158 |
159 ngx_event_actions = ngx_rtsig_module_ctx.actions; | 159 ngx_event_actions = ngx_rtsig_module_ctx.actions; |
160 | 160 |
161 ngx_event_flags = NGX_USE_RTSIG_EVENT | 161 ngx_event_flags = NGX_USE_RTSIG_EVENT|NGX_HAVE_GREEDY_EVENT; |
162 |NGX_HAVE_GREEDY_EVENT | |
163 |NGX_HAVE_INSTANCE_EVENT; | |
164 | 162 |
165 return NGX_OK; | 163 return NGX_OK; |
166 } | 164 } |
167 | 165 |
168 | 166 |
273 ngx_uint_t expire; | 271 ngx_uint_t expire; |
274 size_t n; | 272 size_t n; |
275 ngx_msec_t timer; | 273 ngx_msec_t timer; |
276 ngx_err_t err; | 274 ngx_err_t err; |
277 siginfo_t si; | 275 siginfo_t si; |
276 ngx_event_t *rev, *wev; | |
278 struct timeval tv; | 277 struct timeval tv; |
279 struct timespec ts, *tp; | 278 struct timespec ts, *tp; |
280 struct sigaction sa; | 279 struct sigaction sa; |
281 ngx_epoch_msec_t delta; | 280 ngx_epoch_msec_t delta; |
282 ngx_connection_t *c; | 281 ngx_connection_t *c; |
288 | 287 |
289 } else { | 288 } else { |
290 for ( ;; ) { | 289 for ( ;; ) { |
291 timer = ngx_event_find_timer(); | 290 timer = ngx_event_find_timer(); |
292 | 291 |
292 #if (NGX_THREADS) | |
293 | |
294 if (timer == NGX_TIMER_ERROR) { | |
295 return NGX_ERROR; | |
296 } | |
297 | |
298 if (timer == NGX_TIMER_INFINITE || timer > 500) { | |
299 timer = 500; | |
300 break; | |
301 } | |
302 | |
303 #endif | |
304 | |
293 if (timer != 0) { | 305 if (timer != 0) { |
294 break; | 306 break; |
295 } | 307 } |
296 | 308 |
297 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 309 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
298 "rtsig expired timer"); | 310 "rtsig expired timer"); |
299 | 311 |
300 ngx_event_expire_timers((ngx_msec_t) | 312 ngx_event_expire_timers((ngx_msec_t) |
301 (ngx_elapsed_msec - ngx_old_elapsed_msec)); | 313 (ngx_elapsed_msec - ngx_old_elapsed_msec)); |
314 | |
315 if (ngx_posted_events && ngx_threaded) { | |
316 ngx_wakeup_worker_thread(cycle); | |
317 } | |
302 } | 318 } |
303 | 319 |
304 expire = 1; | 320 expire = 1; |
305 | 321 |
306 if (ngx_accept_mutex) { | 322 if (ngx_accept_mutex) { |
338 ngx_old_elapsed_msec = ngx_elapsed_msec; | 354 ngx_old_elapsed_msec = ngx_elapsed_msec; |
339 | 355 |
340 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 356 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
341 "rtsig timer: %d", timer); | 357 "rtsig timer: %d", timer); |
342 | 358 |
343 /* Linux sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ | 359 /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ |
344 | 360 |
345 signo = sigtimedwait(&set, &si, tp); | 361 signo = sigtimedwait(&set, &si, tp); |
346 | 362 |
347 if (signo == -1) { | 363 if (signo == -1) { |
348 err = ngx_errno; | 364 err = ngx_errno; |
398 | 414 |
399 c = &ngx_cycle->connections[si.si_fd]; | 415 c = &ngx_cycle->connections[si.si_fd]; |
400 | 416 |
401 instance = signo - rtscf->signo; | 417 instance = signo - rtscf->signo; |
402 | 418 |
403 if (si.si_band & POLLIN) { | 419 rev = c->read; |
404 c->read->returned_instance = instance; | 420 |
405 } | |
406 | |
407 if (si.si_band & POLLOUT) { | |
408 c->write->returned_instance = instance; | |
409 } | |
410 | |
411 if (c->read->instance != instance) { | 421 if (c->read->instance != instance) { |
412 | 422 |
413 /* | 423 /* |
414 * the stale event from a file descriptor | 424 * the stale event from a file descriptor |
415 * that was just closed in this iteration | 425 * that was just closed in this iteration |
422 | 432 |
423 return NGX_OK; | 433 return NGX_OK; |
424 } | 434 } |
425 | 435 |
426 if (si.si_band & (POLLIN|POLLHUP|POLLERR)) { | 436 if (si.si_band & (POLLIN|POLLHUP|POLLERR)) { |
427 if (c->read->active) { | 437 if (rev->active) { |
428 c->read->ready = 1; | 438 |
429 | 439 if (ngx_threaded && !rev->accept) { |
430 if (!ngx_threaded && !ngx_accept_mutex_held) { | |
431 c->read->event_handler(c->read); | |
432 | |
433 } else if (c->read->accept) { | |
434 if (ngx_accept_disabled <= 0) { | |
435 c->read->event_handler(c->read); | |
436 } | |
437 | |
438 } else { | |
439 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 440 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { |
440 ngx_accept_mutex_unlock(); | 441 ngx_accept_mutex_unlock(); |
441 return NGX_ERROR; | 442 return NGX_ERROR; |
442 } | 443 } |
443 | 444 |
444 ngx_post_event(c->read); | 445 rev->posted_ready = 1; |
446 ngx_post_event(rev); | |
445 | 447 |
446 ngx_mutex_unlock(ngx_posted_events_mutex); | 448 ngx_mutex_unlock(ngx_posted_events_mutex); |
449 | |
450 } else { | |
451 rev->ready = 1; | |
452 | |
453 if (!ngx_threaded && !ngx_accept_mutex_held) { | |
454 rev->event_handler(rev); | |
455 | |
456 } else if (rev->accept) { | |
457 if (ngx_accept_disabled <= 0) { | |
458 rev->event_handler(rev); | |
459 } | |
460 | |
461 } else { | |
462 ngx_post_event(rev); | |
463 } | |
447 } | 464 } |
448 } | 465 } |
449 } | 466 } |
450 | 467 |
468 wev = c->write; | |
469 | |
451 if (si.si_band & (POLLOUT|POLLHUP|POLLERR)) { | 470 if (si.si_band & (POLLOUT|POLLHUP|POLLERR)) { |
452 if (c->write->active) { | 471 if (wev->active) { |
453 c->write->ready = 1; | 472 |
454 | 473 if (ngx_threaded) { |
455 if (!ngx_threaded && !ngx_accept_mutex_held) { | |
456 c->write->event_handler(c->write); | |
457 | |
458 } else { | |
459 | |
460 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 474 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { |
461 ngx_accept_mutex_unlock(); | 475 ngx_accept_mutex_unlock(); |
462 return NGX_ERROR; | 476 return NGX_ERROR; |
463 } | 477 } |
464 | 478 |
465 ngx_post_event(c->write); | 479 wev->posted_ready = 1; |
480 ngx_post_event(wev); | |
466 | 481 |
467 ngx_mutex_unlock(ngx_posted_events_mutex); | 482 ngx_mutex_unlock(ngx_posted_events_mutex); |
483 | |
484 } else { | |
485 wev->ready = 1; | |
486 | |
487 if (!ngx_threaded && !ngx_accept_mutex_held) { | |
488 wev->event_handler(wev); | |
489 | |
490 } else { | |
491 ngx_post_event(wev); | |
492 } | |
468 } | 493 } |
469 } | 494 } |
470 } | 495 } |
471 | 496 |
472 } else if (signo == SIGIO) { | 497 } else if (signo == SIGIO) { |
510 | 535 |
511 if (expire && delta) { | 536 if (expire && delta) { |
512 ngx_event_expire_timers((ngx_msec_t) delta); | 537 ngx_event_expire_timers((ngx_msec_t) delta); |
513 } | 538 } |
514 | 539 |
515 if (!ngx_threaded) { | 540 if (ngx_posted_events) { |
516 ngx_event_process_posted(cycle); | 541 if (ngx_threaded) { |
542 ngx_wakeup_worker_thread(cycle); | |
543 | |
544 } else { | |
545 ngx_event_process_posted(cycle); | |
546 } | |
517 } | 547 } |
518 | 548 |
519 if (signo == -1) { | 549 if (signo == -1) { |
520 return NGX_AGAIN; | 550 return NGX_AGAIN; |
521 } else { | 551 } else { |
530 { | 560 { |
531 int name[2], rtsig_max, rtsig_nr, events, ready; | 561 int name[2], rtsig_max, rtsig_nr, events, ready; |
532 size_t len; | 562 size_t len; |
533 ngx_int_t tested, n, i; | 563 ngx_int_t tested, n, i; |
534 ngx_err_t err; | 564 ngx_err_t err; |
565 ngx_event_t *rev, *wev; | |
535 ngx_connection_t *c; | 566 ngx_connection_t *c; |
536 ngx_rtsig_conf_t *rtscf; | 567 ngx_rtsig_conf_t *rtscf; |
537 | 568 |
538 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); | 569 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); |
539 | 570 |
585 err = ngx_errno; | 616 err = ngx_errno; |
586 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 617 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
587 cycle->log, 0, | 618 cycle->log, 0, |
588 "poll() failed while the overflow recover"); | 619 "poll() failed while the overflow recover"); |
589 | 620 |
590 if (err == NGX_EINTR) { | 621 if (err != NGX_EINTR) { |
591 continue; | 622 break; |
592 } | 623 } |
593 } | 624 } |
594 | |
595 break; | |
596 } | 625 } |
597 | 626 |
598 if (ready <= 0) { | 627 if (ready <= 0) { |
599 continue; | 628 continue; |
600 } | 629 } |
601 | 630 |
631 if (n) { | |
632 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
633 return NGX_ERROR; | |
634 } | |
635 } | |
636 | |
602 for (i = 0; i < n; i++) { | 637 for (i = 0; i < n; i++) { |
603 c = &cycle->connections[overflow_list[i].fd]; | 638 c = &cycle->connections[overflow_list[i].fd]; |
604 | 639 |
640 rev = c->read; | |
641 | |
605 if (overflow_list[i].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { | 642 if (overflow_list[i].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { |
606 tested++; | 643 tested++; |
607 c->read->ready = 1; | 644 |
608 | 645 if (ngx_threaded) { |
609 if (!ngx_threaded) { | 646 rev->posted_ready = 1; |
610 c->read->event_handler(c->read); | 647 ngx_post_event(rev); |
611 | 648 |
612 } else { | 649 } else { |
613 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 650 rev->ready = 1; |
614 return NGX_ERROR; | 651 rev->event_handler(rev); |
615 } | |
616 | |
617 ngx_post_event(c->read); | |
618 c->read->returned_instance = c->read->instance; | |
619 | |
620 ngx_mutex_unlock(ngx_posted_events_mutex); | |
621 } | 652 } |
622 } | 653 } |
654 | |
655 wev = c->write; | |
623 | 656 |
624 if (overflow_list[i].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { | 657 if (overflow_list[i].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { |
625 tested++; | 658 tested++; |
626 c->write->ready = 1; | 659 |
627 | 660 if (ngx_threaded) { |
628 if (!ngx_threaded) { | 661 wev->posted_ready = 1; |
629 c->write->event_handler(c->write); | 662 ngx_post_event(wev); |
630 | 663 |
631 } else { | 664 } else { |
632 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 665 wev->ready = 1; |
633 return NGX_ERROR; | 666 wev->event_handler(wev); |
634 } | |
635 | |
636 ngx_post_event(c->write); | |
637 c->write->returned_instance = c->write->instance; | |
638 | |
639 ngx_mutex_unlock(ngx_posted_events_mutex); | |
640 } | 667 } |
641 } | 668 } |
669 } | |
670 | |
671 if (n) { | |
672 ngx_mutex_unlock(ngx_posted_events_mutex); | |
642 } | 673 } |
643 | 674 |
644 if (tested >= rtscf->overflow_test) { | 675 if (tested >= rtscf->overflow_test) { |
645 | 676 |
646 /* | 677 /* |
681 | 712 |
682 tested = 0; | 713 tested = 0; |
683 } | 714 } |
684 } | 715 } |
685 | 716 |
686 if (!ngx_threaded) { | 717 if (ngx_posted_events) { |
687 ngx_event_process_posted(cycle); | 718 if (ngx_threaded) { |
719 ngx_wakeup_worker_thread(cycle); | |
720 | |
721 } else { | |
722 ngx_event_process_posted(cycle); | |
723 } | |
688 } | 724 } |
689 | 725 |
690 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, | 726 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, |
691 "rt signal queue overflow recovered"); | 727 "rt signal queue overflow recovered"); |
692 | 728 |