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 {