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