diff options
Diffstat (limited to 'src/microhttpd/test_upgrade_large.c')
-rw-r--r-- | src/microhttpd/test_upgrade_large.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/microhttpd/test_upgrade_large.c b/src/microhttpd/test_upgrade_large.c index fdf2edf7..6f2a1b94 100644 --- a/src/microhttpd/test_upgrade_large.c +++ b/src/microhttpd/test_upgrade_large.c | |||
@@ -67,6 +67,8 @@ | |||
67 | 67 | ||
68 | static int verbose = 0; | 68 | static int verbose = 0; |
69 | 69 | ||
70 | static int kicker[2] = {-1, -1} ; | ||
71 | |||
70 | enum tls_tool | 72 | enum tls_tool |
71 | { | 73 | { |
72 | TLS_CLI_NO_TOOL = 0, | 74 | TLS_CLI_NO_TOOL = 0, |
@@ -570,7 +572,17 @@ make_blocking (MHD_socket fd) | |||
570 | 572 | ||
571 | ioctlsocket (fd, FIONBIO, &flags); | 573 | ioctlsocket (fd, FIONBIO, &flags); |
572 | #endif /* MHD_WINSOCK_SOCKETS */ | 574 | #endif /* MHD_WINSOCK_SOCKETS */ |
575 | } | ||
576 | |||
573 | 577 | ||
578 | static void | ||
579 | kick_select () | ||
580 | { | ||
581 | if (-1 != kicker[1]) | ||
582 | { | ||
583 | write (kicker[1], "K", 1); | ||
584 | fprintf (stderr, "KICKING\n"); | ||
585 | } | ||
574 | } | 586 | } |
575 | 587 | ||
576 | 588 | ||
@@ -588,6 +600,7 @@ send_all (struct wr_socket *sock, | |||
588 | ret = wr_send (sock, | 600 | ret = wr_send (sock, |
589 | &text[off], | 601 | &text[off], |
590 | len - off); | 602 | len - off); |
603 | kick_select (); | ||
591 | if (0 > ret) | 604 | if (0 > ret) |
592 | { | 605 | { |
593 | if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) | 606 | if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) |
@@ -621,6 +634,7 @@ recv_hdr (struct wr_socket *sock) | |||
621 | ret = wr_recv (sock, | 634 | ret = wr_recv (sock, |
622 | &c, | 635 | &c, |
623 | 1); | 636 | 1); |
637 | kick_select (); | ||
624 | if (0 > ret) | 638 | if (0 > ret) |
625 | { | 639 | { |
626 | if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) | 640 | if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) |
@@ -889,7 +903,10 @@ run_mhd_select_loop (struct MHD_Daemon *daemon) | |||
889 | MHD_socket max_fd; | 903 | MHD_socket max_fd; |
890 | MHD_UNSIGNED_LONG_LONG to; | 904 | MHD_UNSIGNED_LONG_LONG to; |
891 | struct timeval tv; | 905 | struct timeval tv; |
906 | char drain[128]; | ||
892 | 907 | ||
908 | if (0 != pipe (kicker)) | ||
909 | abort (); | ||
893 | while (! done) | 910 | while (! done) |
894 | { | 911 | { |
895 | FD_ZERO (&rs); | 912 | FD_ZERO (&rs); |
@@ -898,6 +915,7 @@ run_mhd_select_loop (struct MHD_Daemon *daemon) | |||
898 | max_fd = -1; | 915 | max_fd = -1; |
899 | to = 1000; | 916 | to = 1000; |
900 | 917 | ||
918 | FD_SET (kicker[0], &rs); | ||
901 | if (MHD_YES != | 919 | if (MHD_YES != |
902 | MHD_get_fdset (daemon, | 920 | MHD_get_fdset (daemon, |
903 | &rs, | 921 | &rs, |
@@ -917,11 +935,17 @@ run_mhd_select_loop (struct MHD_Daemon *daemon) | |||
917 | &es, | 935 | &es, |
918 | &tv)) | 936 | &tv)) |
919 | abort (); | 937 | abort (); |
938 | if (FD_ISSET (kicker[0], &rs)) | ||
939 | (void) read (kicker[0], drain, sizeof (drain)); | ||
920 | MHD_run_from_select (daemon, | 940 | MHD_run_from_select (daemon, |
921 | &rs, | 941 | &rs, |
922 | &ws, | 942 | &ws, |
923 | &es); | 943 | &es); |
924 | } | 944 | } |
945 | close (kicker[0]); | ||
946 | close (kicker[1]); | ||
947 | kicker[0] = -1; | ||
948 | kicker[1] = -1; | ||
925 | } | 949 | } |
926 | 950 | ||
927 | #ifdef HAVE_POLL | 951 | #ifdef HAVE_POLL |
@@ -955,15 +979,18 @@ run_mhd_epoll_loop (struct MHD_Daemon *daemon) | |||
955 | MHD_UNSIGNED_LONG_LONG to; | 979 | MHD_UNSIGNED_LONG_LONG to; |
956 | struct timeval tv; | 980 | struct timeval tv; |
957 | int ret; | 981 | int ret; |
982 | char drain[128]; | ||
958 | 983 | ||
959 | di = MHD_get_daemon_info (daemon, | 984 | di = MHD_get_daemon_info (daemon, |
960 | MHD_DAEMON_INFO_EPOLL_FD); | 985 | MHD_DAEMON_INFO_EPOLL_FD); |
961 | ep = di->listen_fd; | 986 | ep = di->listen_fd; |
987 | if (0 != pipe (kicker)) | ||
988 | abort (); | ||
962 | while (! done) | 989 | while (! done) |
963 | { | 990 | { |
964 | FD_ZERO (&rs); | 991 | FD_ZERO (&rs); |
965 | to = 1000; | 992 | to = 1000; |
966 | 993 | FD_SET (kicker[0], &rs); | |
967 | FD_SET (ep, &rs); | 994 | FD_SET (ep, &rs); |
968 | (void) MHD_get_timeout (daemon, | 995 | (void) MHD_get_timeout (daemon, |
969 | &to); | 996 | &to); |
@@ -980,8 +1007,14 @@ run_mhd_epoll_loop (struct MHD_Daemon *daemon) | |||
980 | (EAGAIN != errno) && | 1007 | (EAGAIN != errno) && |
981 | (EINTR != errno) ) | 1008 | (EINTR != errno) ) |
982 | abort (); | 1009 | abort (); |
1010 | if (FD_ISSET (kicker[0], &rs)) | ||
1011 | (void) read (kicker[0], drain, sizeof (drain)); | ||
983 | MHD_run (daemon); | 1012 | MHD_run (daemon); |
984 | } | 1013 | } |
1014 | close (kicker[0]); | ||
1015 | close (kicker[1]); | ||
1016 | kicker[0] = -1; | ||
1017 | kicker[1] = -1; | ||
985 | } | 1018 | } |
986 | #endif /* EPOLL_SUPPORT */ | 1019 | #endif /* EPOLL_SUPPORT */ |
987 | 1020 | ||
@@ -1080,8 +1113,8 @@ test_upgrade (int flags, | |||
1080 | sa.sin_port = htons (dinfo->port); | 1113 | sa.sin_port = htons (dinfo->port); |
1081 | sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK); | 1114 | sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK); |
1082 | if (0 != wr_connect (sock, | 1115 | if (0 != wr_connect (sock, |
1083 | (struct sockaddr *) &sa, | 1116 | (struct sockaddr *) &sa, |
1084 | sizeof (sa))) | 1117 | sizeof (sa))) |
1085 | abort (); | 1118 | abort (); |
1086 | } | 1119 | } |
1087 | else | 1120 | else |