Mercurial > hg > nginx-quic
comparison src/http/ngx_http_event.c @ 60:50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 11 Feb 2003 07:14:40 +0000 |
parents | e8cdc2989cee |
children | 34d647deb1da |
comparison
equal
deleted
inserted
replaced
59:e8cdc2989cee | 60:50186b49f2ad |
---|---|
28 static int ngx_http_event_request_handler(ngx_http_request_t *r); | 28 static int ngx_http_event_request_handler(ngx_http_request_t *r); |
29 | 29 |
30 static int ngx_http_writer(ngx_event_t *ev); | 30 static int ngx_http_writer(ngx_event_t *ev); |
31 static int ngx_http_block_read(ngx_event_t *ev); | 31 static int ngx_http_block_read(ngx_event_t *ev); |
32 static int ngx_http_read_discarded_body(ngx_event_t *ev); | 32 static int ngx_http_read_discarded_body(ngx_event_t *ev); |
33 static int ngx_http_set_keepalive(ngx_http_request_t *r); | |
33 static int ngx_http_keepalive_handler(ngx_event_t *ev); | 34 static int ngx_http_keepalive_handler(ngx_event_t *ev); |
34 static int ngx_http_set_lingering_close(ngx_http_request_t *r); | 35 static int ngx_http_set_lingering_close(ngx_http_request_t *r); |
35 static int ngx_http_lingering_close_handler(ngx_event_t *ev); | 36 static int ngx_http_lingering_close_handler(ngx_event_t *ev); |
36 | 37 |
37 static int ngx_http_close_connection(ngx_event_t *ev); | 38 static int ngx_http_close_connection(ngx_event_t *ev); |
110 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); | 111 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); |
111 } | 112 } |
112 | 113 |
113 #endif | 114 #endif |
114 | 115 |
116 /* THINK: should ngx_edge_add_event() be moved to accept part ? */ | |
115 #if (HAVE_EDGE_EVENT) /* epoll */ | 117 #if (HAVE_EDGE_EVENT) /* epoll */ |
116 | 118 |
117 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { | 119 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { |
118 if (ngx_add_event(ev, NGX_READ_EVENT, NGX_EDGE_EVENT) == NGX_ERROR) { | 120 if (ngx_edge_add_event(ev) == NGX_ERROR) { |
119 return NGX_ERROR; | 121 return NGX_ERROR; |
120 } | 122 } |
121 return ngx_http_init_request(ev); | 123 return ngx_http_init_request(ev); |
122 } | 124 } |
123 | 125 |
127 | 129 |
128 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { | 130 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { |
129 return ngx_http_init_request(ev); | 131 return ngx_http_init_request(ev); |
130 } | 132 } |
131 | 133 |
132 #endif /* HAVE_AIO_EVENT */ | 134 #endif |
133 | 135 |
134 /* select, poll, /dev/poll */ | 136 /* select, poll, /dev/poll */ |
135 | 137 |
136 return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); | 138 return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); |
137 | 139 |
496 | 498 |
497 return rc; | 499 return rc; |
498 | 500 |
499 #else | 501 #else |
500 | 502 |
501 #if (HAVE_AIO_EVENT) /* aio, iocp */ | 503 #if (HAVE_AIO_EVENT) || (HAVE_EDGE_EVENT) /* aio, iocp, epoll */ |
502 | 504 |
503 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { | 505 if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { |
504 return rc; | 506 return rc; |
505 } | 507 } |
506 | 508 |
507 #endif | 509 #endif |
508 | 510 |
510 | 512 |
511 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { | 513 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { |
512 event = NGX_CLEAR_EVENT; | 514 event = NGX_CLEAR_EVENT; |
513 | 515 |
514 } else { | 516 } else { |
515 event = NGX_ONESHOT_EVENT; | |
516 } | |
517 | |
518 #elif (HAVE_EDGE_EVENT) /* epoll */ | |
519 | |
520 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { | |
521 event = NGX_EDGE_EVENT; | |
522 | |
523 } else { | |
524 event = NGX_ONESHOT_EVENT; | |
525 } | |
526 | |
527 #elif (HAVE_DEVPOLL_EVENT) /* /dev/poll */ | |
528 | |
529 if (ngx_event_flags & NGX_HAVE_LEVEL_EVENT) { | |
530 event = NGX_LEVEL_EVENT; | 517 event = NGX_LEVEL_EVENT; |
531 | 518 r->write_level_event = 1; |
532 } else { | 519 } |
533 event = NGX_ONESHOT_EVENT; | 520 |
534 } | 521 #else /* select, poll, /dev/poll */ |
535 | 522 |
536 #else /* select, poll */ | 523 event = NGX_LEVEL_EVENT; |
537 | 524 r->write_level_event = 1; |
538 event = NGX_ONESHOT_EVENT; | |
539 | 525 |
540 #endif | 526 #endif |
541 | 527 |
542 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) == NGX_ERROR) { | 528 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) == NGX_ERROR) { |
543 return ngx_http_close_request(r); | 529 return ngx_http_close_request(r); |
569 } | 555 } |
570 } | 556 } |
571 | 557 |
572 /* keepalive */ | 558 /* keepalive */ |
573 | 559 |
574 r->connection->buffer->pos.mem = r->connection->buffer->last.mem | 560 return ngx_http_set_keepalive(r); |
575 = r->connection->buffer->start; | |
576 rev->event_handler = ngx_http_keepalive_handler; | |
577 | |
578 ngx_http_close_request(r); | |
579 | |
580 return NGX_OK; | |
581 } | 561 } |
582 | 562 |
583 | 563 |
584 static int ngx_http_writer(ngx_event_t *ev) | 564 static int ngx_http_writer(ngx_event_t *ev) |
585 { | 565 { |
615 } | 595 } |
616 | 596 |
617 ngx_add_timer(ev, timeout); | 597 ngx_add_timer(ev, timeout); |
618 } | 598 } |
619 | 599 |
620 /* TODO: /dev/poll, epoll, aio_write */ | |
621 | |
622 if (ev->oneshot) | |
623 if (ngx_add_event(ev, NGX_WRITE_EVENT, NGX_ONESHOT_EVENT) | |
624 == NGX_ERROR) { | |
625 return ngx_http_close_request(r); | |
626 } | |
627 | |
628 return rc; | 600 return rc; |
629 } | 601 } |
630 | 602 |
631 if (rc == NGX_ERROR) | 603 if (rc == NGX_ERROR) |
632 return rc; | 604 return rc; |
644 } | 616 } |
645 } | 617 } |
646 | 618 |
647 /* keepalive */ | 619 /* keepalive */ |
648 | 620 |
649 c->buffer->pos.mem = c->buffer->last.mem = c->buffer->start; | 621 return ngx_http_set_keepalive(r); |
650 c->read->event_handler = ngx_http_keepalive_handler; | 622 } |
651 | 623 |
652 ngx_http_close_request(r); | 624 |
653 | 625 /* TODO */ |
654 return NGX_OK; | |
655 } | |
656 | |
657 | |
658 static int ngx_http_block_read(ngx_event_t *ev) | 626 static int ngx_http_block_read(ngx_event_t *ev) |
659 { | 627 { |
660 ngx_log_debug(ev->log, "http read blocked"); | 628 ngx_log_debug(ev->log, "http read blocked"); |
661 | 629 |
662 /* aio does not call this handler */ | 630 /* aio does not call this handler */ |
691 | 659 |
692 #endif /* USE_KQUEUE */ | 660 #endif /* USE_KQUEUE */ |
693 } | 661 } |
694 | 662 |
695 | 663 |
664 /* TODO */ | |
696 int ngx_http_discard_body(ngx_http_request_t *r) | 665 int ngx_http_discard_body(ngx_http_request_t *r) |
697 { | 666 { |
698 ngx_event_t *ev; | 667 ngx_event_t *ev; |
699 | 668 |
700 ev = r->connection->read; | 669 ev = r->connection->read; |
714 | 683 |
715 return NGX_OK; | 684 return NGX_OK; |
716 } | 685 } |
717 | 686 |
718 | 687 |
688 /* TODO */ | |
719 static int ngx_http_read_discarded_body(ngx_event_t *ev) | 689 static int ngx_http_read_discarded_body(ngx_event_t *ev) |
720 { | 690 { |
721 size_t size; | 691 size_t size; |
722 ssize_t n; | 692 ssize_t n; |
723 ngx_connection_t *c; | 693 ngx_connection_t *c; |
755 /* XXX: what if r->client_content_length == 0 ? */ | 725 /* XXX: what if r->client_content_length == 0 ? */ |
756 return NGX_OK; | 726 return NGX_OK; |
757 } | 727 } |
758 | 728 |
759 | 729 |
730 /* TODO: if c->read->blocked */ | |
731 static int ngx_http_set_keepalive(ngx_http_request_t *r) | |
732 { | |
733 ngx_connection_t *c; | |
734 | |
735 c = (ngx_connection_t *) r->connection; | |
736 | |
737 c->buffer->pos.mem = c->buffer->last.mem = c->buffer->start; | |
738 c->read->event_handler = ngx_http_keepalive_handler; | |
739 | |
740 if (r->write_level_event) { | |
741 if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) == NGX_ERROR) { | |
742 return NGX_ERROR; | |
743 } | |
744 } | |
745 | |
746 ngx_http_close_request(r); | |
747 | |
748 #if (HAVE_AIO_EVENT) /* aio, iocp */ | |
749 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { | |
750 return ngx_http_keepalive_handler(c->read); | |
751 } | |
752 #endif | |
753 | |
754 return NGX_OK; | |
755 } | |
756 | |
757 | |
760 static int ngx_http_keepalive_handler(ngx_event_t *ev) | 758 static int ngx_http_keepalive_handler(ngx_event_t *ev) |
761 { | 759 { |
762 ssize_t n; | 760 ssize_t n; |
763 ngx_connection_t *c; | 761 ngx_connection_t *c; |
764 ngx_http_log_ctx_t *ctx; | 762 ngx_http_log_ctx_t *ctx; |
794 | 792 |
795 | 793 |
796 static int ngx_http_set_lingering_close(ngx_http_request_t *r) | 794 static int ngx_http_set_lingering_close(ngx_http_request_t *r) |
797 { | 795 { |
798 ngx_event_t *ev; | 796 ngx_event_t *ev; |
797 ngx_connection_t *c; | |
799 ngx_http_core_loc_conf_t *lcf; | 798 ngx_http_core_loc_conf_t *lcf; |
800 | 799 |
800 c = r->connection; | |
801 ev = r->connection->read; | 801 ev = r->connection->read; |
802 | 802 |
803 lcf = (ngx_http_core_loc_conf_t *) | 803 lcf = (ngx_http_core_loc_conf_t *) |
804 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); | 804 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); |
805 | 805 |
830 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno, | 830 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno, |
831 ngx_shutdown_socket_n " failed"); | 831 ngx_shutdown_socket_n " failed"); |
832 return ngx_http_close_request(r); | 832 return ngx_http_close_request(r); |
833 } | 833 } |
834 | 834 |
835 return NGX_OK; | 835 #if (HAVE_AIO_EVENT) /* aio, iocp */ |
836 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { | |
837 return ngx_http_lingering_close_handler(ev); | |
838 } | |
839 #endif | |
840 | |
841 #if (HAVE_CLEAR_EVENT) || (HAVE_EDGE_EVENT) /* kqueue, epoll */ | |
842 if (ngx_event_flags & (NGX_HAVE_CLEAR_EVENT|NGX_HAVE_EDGE_EVENT)) { | |
843 return NGX_OK; | |
844 } | |
845 #endif | |
846 | |
847 /* select, poll, /dev/poll */ | |
848 | |
849 return ngx_del_event(c->write, NGX_WRITE_EVENT, 0); | |
836 } | 850 } |
837 | 851 |
838 | 852 |
839 static int ngx_http_lingering_close_handler(ngx_event_t *ev) | 853 static int ngx_http_lingering_close_handler(ngx_event_t *ev) |
840 { | 854 { |