Revision 90fc8d36 deps/liboi/oi_socket.c
deps/liboi/oi_socket.c | ||
---|---|---|
11 | 11 |
#include <ev.h> |
12 | 12 |
#include <oi_socket.h> |
13 | 13 |
|
14 |
#if EV_MULTIPLICITY |
|
15 |
# define SOCKET_LOOP_ socket->loop, |
|
16 |
# define SERVER_LOOP_ server->loop, |
|
17 |
#else |
|
18 |
# define SOCKET_LOOP_ |
|
19 |
# define SERVER_LOOP_ |
|
20 |
#endif // EV_MULTIPLICITY |
|
21 |
|
|
14 | 22 |
#if HAVE_GNUTLS |
15 | 23 |
# include <gnutls/gnutls.h> |
16 | 24 |
# define GNUTLS_NEED_WRITE (gnutls_record_get_direction(socket->session) == 1) |
... | ... | |
49 | 57 |
socket->read_action = NULL; |
50 | 58 |
socket->write_action = NULL; |
51 | 59 |
|
52 |
if(socket->loop) {
|
|
53 |
ev_feed_event(socket->loop, &socket->read_watcher, EV_READ);
|
|
60 |
if(socket->attached) {
|
|
61 |
ev_feed_event(SOCKET_LOOP_ &socket->read_watcher, EV_READ);
|
|
54 | 62 |
} |
55 | 63 |
return OKAY; |
56 | 64 |
} |
... | ... | |
88 | 96 |
} |
89 | 97 |
|
90 | 98 |
if(oi_queue_empty(&socket->out_stream)) { |
91 |
ev_io_stop(socket->loop, &socket->write_watcher);
|
|
99 |
ev_io_stop(SOCKET_LOOP_ &socket->write_watcher);
|
|
92 | 100 |
if(socket->on_drain) |
93 | 101 |
socket->on_drain(socket); |
94 | 102 |
} |
... | ... | |
160 | 168 |
ssize_t sent; |
161 | 169 |
|
162 | 170 |
if(oi_queue_empty(&socket->out_stream)) { |
163 |
ev_io_stop(socket->loop, &socket->write_watcher);
|
|
171 |
ev_io_stop(SOCKET_LOOP_ &socket->write_watcher);
|
|
164 | 172 |
return AGAIN; |
165 | 173 |
} |
166 | 174 |
|
... | ... | |
337 | 345 |
assert(socket->secure == FALSE); |
338 | 346 |
|
339 | 347 |
if(oi_queue_empty(&socket->out_stream)) { |
340 |
ev_io_stop(socket->loop, &socket->write_watcher);
|
|
348 |
ev_io_stop(SOCKET_LOOP_ &socket->write_watcher);
|
|
341 | 349 |
return AGAIN; |
342 | 350 |
} |
343 | 351 |
|
... | ... | |
477 | 485 |
* Called by server->connection_watcher. |
478 | 486 |
*/ |
479 | 487 |
static void |
480 |
on_connection(struct ev_loop *loop, ev_io *watcher, int revents)
|
|
488 |
on_connection(EV_P_ ev_io *watcher, int revents)
|
|
481 | 489 |
{ |
482 | 490 |
oi_server *server = watcher->data; |
483 | 491 |
|
484 | 492 |
// printf("on connection!\n"); |
485 | 493 |
|
486 | 494 |
assert(server->listening); |
495 |
#if EV_MULTIPLICITY |
|
487 | 496 |
assert(server->loop == loop); |
497 |
#endif |
|
488 | 498 |
assert(&server->connection_watcher == watcher); |
489 | 499 |
|
490 | 500 |
if(EV_ERROR & revents) { |
... | ... | |
524 | 534 |
|
525 | 535 |
socket->server = server; |
526 | 536 |
assign_file_descriptor(socket, fd); |
527 |
oi_socket_attach(socket, loop);
|
|
537 |
oi_socket_attach(EV_A_ socket);
|
|
528 | 538 |
} |
529 | 539 |
|
530 | 540 |
int |
... | ... | |
595 | 605 |
} |
596 | 606 |
|
597 | 607 |
void |
598 |
oi_server_attach (oi_server *server, struct ev_loop *loop)
|
|
608 |
oi_server_attach (EV_P_ oi_server *server)
|
|
599 | 609 |
{ |
600 |
ev_io_start (loop, &server->connection_watcher); |
|
610 |
ev_io_start (EV_A_ &server->connection_watcher); |
|
611 |
#if EV_MULTIPLICITY |
|
601 | 612 |
server->loop = loop; |
613 |
#endif |
|
614 |
server->attached = TRUE; |
|
602 | 615 |
} |
603 | 616 |
|
604 | 617 |
void |
605 | 618 |
oi_server_detach (oi_server *server) |
606 | 619 |
{ |
607 |
ev_io_stop (server->loop, &server->connection_watcher); |
|
620 |
ev_io_stop (SERVER_LOOP_ &server->connection_watcher); |
|
621 |
#if EV_MULTIPLICITY |
|
608 | 622 |
server->loop = NULL; |
623 |
#endif |
|
624 |
server->attached = FALSE; |
|
609 | 625 |
} |
610 | 626 |
|
611 | 627 |
void |
612 | 628 |
oi_server_init(oi_server *server, int backlog) |
613 | 629 |
{ |
614 | 630 |
server->backlog = backlog; |
631 |
server->attached = FALSE; |
|
615 | 632 |
server->listening = FALSE; |
616 | 633 |
server->fd = -1; |
617 | 634 |
server->connection_watcher.data = server; |
... | ... | |
624 | 641 |
|
625 | 642 |
/* Internal callback. called by socket->timeout_watcher */ |
626 | 643 |
static void |
627 |
on_timeout(struct ev_loop *loop, ev_timer *watcher, int revents)
|
|
644 |
on_timeout(EV_P_ ev_timer *watcher, int revents)
|
|
628 | 645 |
{ |
629 | 646 |
oi_socket *socket = watcher->data; |
630 | 647 |
|
... | ... | |
652 | 669 |
|
653 | 670 |
/* Internal callback. called by socket->read_watcher */ |
654 | 671 |
static void |
655 |
on_io_event(struct ev_loop *loop, ev_io *watcher, int revents)
|
|
672 |
on_io_event(EV_P_ ev_io *watcher, int revents)
|
|
656 | 673 |
{ |
657 | 674 |
oi_socket *socket = watcher->data; |
658 | 675 |
|
... | ... | |
698 | 715 |
close: |
699 | 716 |
release_write_buffer(socket); |
700 | 717 |
|
701 |
ev_clear_pending (socket->loop, &socket->write_watcher);
|
|
702 |
ev_clear_pending (socket->loop, &socket->read_watcher);
|
|
703 |
ev_clear_pending (socket->loop, &socket->timeout_watcher);
|
|
718 |
ev_clear_pending (EV_A_ &socket->write_watcher);
|
|
719 |
ev_clear_pending (EV_A_ &socket->read_watcher);
|
|
720 |
ev_clear_pending (EV_A_ &socket->timeout_watcher);
|
|
704 | 721 |
|
705 | 722 |
oi_socket_detach(socket); |
706 | 723 |
|
... | ... | |
721 | 738 |
{ |
722 | 739 |
socket->fd = -1; |
723 | 740 |
socket->server = NULL; |
741 |
#if EV_MULTIPLICITY |
|
724 | 742 |
socket->loop = NULL; |
743 |
#endif |
|
744 |
socket->attached = FALSE; |
|
725 | 745 |
socket->connected = FALSE; |
726 | 746 |
|
727 | 747 |
oi_queue_init(&socket->out_stream); |
... | ... | |
765 | 785 |
) |
766 | 786 |
{ |
767 | 787 |
socket->write_action = secure_half_goodbye; |
768 |
if(socket->loop)
|
|
769 |
ev_io_start(socket->loop, &socket->write_watcher);
|
|
788 |
if(socket->attached)
|
|
789 |
ev_io_start(SOCKET_LOOP_ &socket->write_watcher);
|
|
770 | 790 |
return; |
771 | 791 |
} |
772 | 792 |
/* secure servers cannot handle half-closed connections? */ |
... | ... | |
799 | 819 |
socket->read_action = NULL; |
800 | 820 |
} |
801 | 821 |
|
802 |
if(socket->loop)
|
|
803 |
ev_io_start(socket->loop, &socket->write_watcher);
|
|
822 |
if(socket->attached)
|
|
823 |
ev_io_start(SOCKET_LOOP_ &socket->write_watcher);
|
|
804 | 824 |
|
805 | 825 |
return; |
806 | 826 |
} |
... | ... | |
815 | 835 |
void |
816 | 836 |
oi_socket_reset_timeout(oi_socket *socket) |
817 | 837 |
{ |
818 |
ev_timer_again(socket->loop, &socket->timeout_watcher);
|
|
838 |
ev_timer_again(SOCKET_LOOP_ &socket->timeout_watcher);
|
|
819 | 839 |
} |
820 | 840 |
|
821 | 841 |
/** |
... | ... | |
831 | 851 |
oi_queue_insert_head(&socket->out_stream, &buf->queue); |
832 | 852 |
|
833 | 853 |
buf->written = 0; |
834 |
ev_io_start(socket->loop, &socket->write_watcher); |
|
854 |
// XXX if (socket->attached) ?? |
|
855 |
ev_io_start(SOCKET_LOOP_ &socket->write_watcher); |
|
835 | 856 |
} |
836 | 857 |
|
837 | 858 |
static void |
... | ... | |
856 | 877 |
} |
857 | 878 |
|
858 | 879 |
void |
859 |
oi_socket_attach(oi_socket *socket, struct ev_loop *loop)
|
|
880 |
oi_socket_attach(EV_P_ oi_socket *socket)
|
|
860 | 881 |
{ |
882 |
#if EV_MULTIPLICITY |
|
861 | 883 |
socket->loop = loop; |
884 |
#endif |
|
885 |
socket->attached = TRUE; |
|
862 | 886 |
|
863 |
ev_timer_again(loop, &socket->timeout_watcher);
|
|
887 |
ev_timer_again(EV_A_ &socket->timeout_watcher);
|
|
864 | 888 |
|
865 | 889 |
if(socket->read_action) |
866 |
ev_io_start(loop, &socket->read_watcher);
|
|
890 |
ev_io_start(EV_A_ &socket->read_watcher);
|
|
867 | 891 |
|
868 | 892 |
if(socket->write_action) |
869 |
ev_io_start(loop, &socket->write_watcher);
|
|
893 |
ev_io_start(EV_A_ &socket->write_watcher);
|
|
870 | 894 |
|
871 | 895 |
/* make sure the io_event happens soon in the case we're being reattached */ |
872 |
ev_feed_event(loop, &socket->read_watcher, EV_READ);
|
|
896 |
ev_feed_event(EV_A_ &socket->read_watcher, EV_READ);
|
|
873 | 897 |
} |
874 | 898 |
|
875 | 899 |
void |
876 | 900 |
oi_socket_detach(oi_socket *socket) |
877 | 901 |
{ |
878 |
if(socket->loop) { |
|
879 |
ev_io_stop(socket->loop, &socket->write_watcher); |
|
880 |
ev_io_stop(socket->loop, &socket->read_watcher); |
|
881 |
ev_timer_stop(socket->loop, &socket->timeout_watcher); |
|
902 |
if(socket->attached) { |
|
903 |
ev_io_stop(SOCKET_LOOP_ &socket->write_watcher); |
|
904 |
ev_io_stop(SOCKET_LOOP_ &socket->read_watcher); |
|
905 |
ev_timer_stop(SOCKET_LOOP_ &socket->timeout_watcher); |
|
906 |
#if EV_MULTIPLICITY |
|
882 | 907 |
socket->loop = NULL; |
908 |
#endif |
|
909 |
socket->attached = FALSE; |
|
883 | 910 |
} |
884 | 911 |
} |
885 | 912 |
|
886 | 913 |
void |
887 | 914 |
oi_socket_read_stop (oi_socket *socket) |
888 | 915 |
{ |
889 |
ev_io_stop(socket->loop, &socket->read_watcher);
|
|
890 |
ev_clear_pending (socket->loop, &socket->read_watcher);
|
|
916 |
ev_io_stop(SOCKET_LOOP_ &socket->read_watcher);
|
|
917 |
ev_clear_pending (SOCKET_LOOP_ &socket->read_watcher);
|
|
891 | 918 |
} |
892 | 919 |
|
893 | 920 |
void |
894 | 921 |
oi_socket_read_start (oi_socket *socket) |
895 | 922 |
{ |
896 | 923 |
if(socket->read_action) { |
897 |
ev_io_start(socket->loop, &socket->read_watcher);
|
|
924 |
ev_io_start(SOCKET_LOOP_ &socket->read_watcher);
|
|
898 | 925 |
/* XXX feed event? */ |
899 | 926 |
} |
900 | 927 |
} |
Also available in: Unified diff