diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/daemon_destroy.c | 15 | ||||
-rw-r--r-- | src/lib/daemon_start.c | 51 | ||||
-rw-r--r-- | src/lib/request_resume.c | 8 |
3 files changed, 41 insertions, 33 deletions
diff --git a/src/lib/daemon_destroy.c b/src/lib/daemon_destroy.c index a236ba8f..ae8c33d8 100644 --- a/src/lib/daemon_destroy.c +++ b/src/lib/daemon_destroy.c | |||
@@ -37,7 +37,7 @@ stop_workers (struct MHD_Daemon *daemon) | |||
37 | { | 37 | { |
38 | MHD_socket fd; | 38 | MHD_socket fd; |
39 | unsigned int i; | 39 | unsigned int i; |
40 | 40 | ||
41 | mhd_assert (1 < daemon->worker_pool_size); | 41 | mhd_assert (1 < daemon->worker_pool_size); |
42 | mhd_assert (1 < daemon->threading_model); | 42 | mhd_assert (1 < daemon->threading_model); |
43 | if (daemon->was_quiesced) | 43 | if (daemon->was_quiesced) |
@@ -102,7 +102,7 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
102 | fd = daemon->listen_socket; | 102 | fd = daemon->listen_socket; |
103 | 103 | ||
104 | /* FIXME: convert from here to microhttpd2-style API! */ | 104 | /* FIXME: convert from here to microhttpd2-style API! */ |
105 | 105 | ||
106 | if (NULL != daemon->worker_pool) | 106 | if (NULL != daemon->worker_pool) |
107 | { /* Master daemon with worker pool. */ | 107 | { /* Master daemon with worker pool. */ |
108 | stop_workers (daemon); | 108 | stop_workers (daemon); |
@@ -114,9 +114,6 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
114 | if (MHD_TM_EXTERNAL_EVENT_LOOP != daemon->threading_model) | 114 | if (MHD_TM_EXTERNAL_EVENT_LOOP != daemon->threading_model) |
115 | { | 115 | { |
116 | /* Worker daemon or single daemon with internal thread(s). */ | 116 | /* Worker daemon or single daemon with internal thread(s). */ |
117 | if (! daemon->disallow_suspend_resume) | ||
118 | (void) MHD_resume_suspended_connections_ (daemon); | ||
119 | |||
120 | /* Separate thread(s) is used for polling sockets. */ | 117 | /* Separate thread(s) is used for polling sockets. */ |
121 | if (MHD_ITC_IS_VALID_(daemon->itc)) | 118 | if (MHD_ITC_IS_VALID_(daemon->itc)) |
122 | { | 119 | { |
@@ -137,7 +134,7 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
137 | #endif /* HAVE_LISTEN_SHUTDOWN */ | 134 | #endif /* HAVE_LISTEN_SHUTDOWN */ |
138 | mhd_assert (false); /* Should never happen */ | 135 | mhd_assert (false); /* Should never happen */ |
139 | } | 136 | } |
140 | 137 | ||
141 | if (! MHD_join_thread_ (daemon->pid.handle)) | 138 | if (! MHD_join_thread_ (daemon->pid.handle)) |
142 | { | 139 | { |
143 | MHD_PANIC (_("Failed to join a thread\n")); | 140 | MHD_PANIC (_("Failed to join a thread\n")); |
@@ -171,10 +168,10 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
171 | return; | 168 | return; |
172 | /* Cleanup that should be done only one time in master/single daemon. | 169 | /* Cleanup that should be done only one time in master/single daemon. |
173 | * Do not perform this cleanup in worker daemons. */ | 170 | * Do not perform this cleanup in worker daemons. */ |
174 | 171 | ||
175 | if (MHD_INVALID_SOCKET != fd) | 172 | if (MHD_INVALID_SOCKET != fd) |
176 | MHD_socket_close_chk_ (fd); | 173 | MHD_socket_close_chk_ (fd); |
177 | 174 | ||
178 | /* TLS clean up */ | 175 | /* TLS clean up */ |
179 | #ifdef HTTPS_SUPPORT | 176 | #ifdef HTTPS_SUPPORT |
180 | if (NULL != daemon->tls_api) | 177 | if (NULL != daemon->tls_api) |
@@ -191,7 +188,7 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
191 | #endif | 188 | #endif |
192 | } | 189 | } |
193 | #endif /* HTTPS_SUPPORT */ | 190 | #endif /* HTTPS_SUPPORT */ |
194 | 191 | ||
195 | #ifdef DAUTH_SUPPORT | 192 | #ifdef DAUTH_SUPPORT |
196 | free (daemon->nnc); | 193 | free (daemon->nnc); |
197 | MHD_mutex_destroy_chk_ (&daemon->nnc_lock); | 194 | MHD_mutex_destroy_chk_ (&daemon->nnc_lock); |
diff --git a/src/lib/daemon_start.c b/src/lib/daemon_start.c index a3099d75..4705851d 100644 --- a/src/lib/daemon_start.c +++ b/src/lib/daemon_start.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "daemon_select.h" | 28 | #include "daemon_select.h" |
29 | #include "daemon_poll.h" | 29 | #include "daemon_poll.h" |
30 | #include "daemon_epoll.h" | 30 | #include "daemon_epoll.h" |
31 | #include "request_resume.h" | ||
31 | 32 | ||
32 | 33 | ||
33 | /** | 34 | /** |
@@ -159,7 +160,7 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
159 | const struct sockaddr *sa; | 160 | const struct sockaddr *sa; |
160 | int pf; | 161 | int pf; |
161 | bool use_v6; | 162 | bool use_v6; |
162 | 163 | ||
163 | if (MHD_INVALID_SOCKET != daemon->listen_socket) | 164 | if (MHD_INVALID_SOCKET != daemon->listen_socket) |
164 | return MHD_SC_OK; /* application opened it for us! */ | 165 | return MHD_SC_OK; /* application opened it for us! */ |
165 | 166 | ||
@@ -223,7 +224,7 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
223 | return MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD; | 224 | return MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD; |
224 | #endif | 225 | #endif |
225 | } | 226 | } |
226 | 227 | ||
227 | /* try to open listen socket */ | 228 | /* try to open listen socket */ |
228 | try_open_listen_socket: | 229 | try_open_listen_socket: |
229 | daemon->listen_socket = MHD_socket_create_listen_(pf); | 230 | daemon->listen_socket = MHD_socket_create_listen_(pf); |
@@ -235,7 +236,7 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
235 | pf = PF_INET; | 236 | pf = PF_INET; |
236 | goto try_open_listen_socket; | 237 | goto try_open_listen_socket; |
237 | } | 238 | } |
238 | if (MHD_INVALID_SOCKET == daemon->listen_socket) | 239 | if (MHD_INVALID_SOCKET == daemon->listen_socket) |
239 | { | 240 | { |
240 | #ifdef HAVE_MESSAGES | 241 | #ifdef HAVE_MESSAGES |
241 | MHD_DLOG (daemon, | 242 | MHD_DLOG (daemon, |
@@ -281,7 +282,7 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
281 | #endif | 282 | #endif |
282 | #endif | 283 | #endif |
283 | } | 284 | } |
284 | 285 | ||
285 | /* Determine address to bind to */ | 286 | /* Determine address to bind to */ |
286 | if (0 != daemon->listen_sa_len) | 287 | if (0 != daemon->listen_sa_len) |
287 | { | 288 | { |
@@ -332,8 +333,8 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
332 | } | 333 | } |
333 | sa = (const struct sockaddr *) &ss; | 334 | sa = (const struct sockaddr *) &ss; |
334 | } | 335 | } |
335 | 336 | ||
336 | /* actually do the bind() */ | 337 | /* actually do the bind() */ |
337 | if (-1 == bind (daemon->listen_socket, | 338 | if (-1 == bind (daemon->listen_socket, |
338 | sa, | 339 | sa, |
339 | addrlen)) | 340 | addrlen)) |
@@ -406,7 +407,7 @@ open_listen_socket (struct MHD_Daemon *daemon) | |||
406 | } | 407 | } |
407 | 408 | ||
408 | 409 | ||
409 | /** | 410 | /** |
410 | * Obtain the listen port number from the socket (if it | 411 | * Obtain the listen port number from the socket (if it |
411 | * was not explicitly set by us, i.e. if we were given | 412 | * was not explicitly set by us, i.e. if we were given |
412 | * a listen socket or if the port was 0 and the OS picked | 413 | * a listen socket or if the port was 0 and the OS picked |
@@ -419,7 +420,7 @@ get_listen_port_number (struct MHD_Daemon *daemon) | |||
419 | { | 420 | { |
420 | struct sockaddr_storage servaddr; | 421 | struct sockaddr_storage servaddr; |
421 | socklen_t addrlen; | 422 | socklen_t addrlen; |
422 | 423 | ||
423 | if ( (0 != daemon->listen_port) || | 424 | if ( (0 != daemon->listen_port) || |
424 | (MHD_INVALID_SOCKET == daemon->listen_socket) ) | 425 | (MHD_INVALID_SOCKET == daemon->listen_socket) ) |
425 | return; /* nothing to be done */ | 426 | return; /* nothing to be done */ |
@@ -457,7 +458,7 @@ get_listen_port_number (struct MHD_Daemon *daemon) | |||
457 | case AF_INET: | 458 | case AF_INET: |
458 | { | 459 | { |
459 | struct sockaddr_in *s4 = (struct sockaddr_in *) &servaddr; | 460 | struct sockaddr_in *s4 = (struct sockaddr_in *) &servaddr; |
460 | 461 | ||
461 | daemon->listen_port = ntohs (s4->sin_port); | 462 | daemon->listen_port = ntohs (s4->sin_port); |
462 | break; | 463 | break; |
463 | } | 464 | } |
@@ -465,7 +466,7 @@ get_listen_port_number (struct MHD_Daemon *daemon) | |||
465 | case AF_INET6: | 466 | case AF_INET6: |
466 | { | 467 | { |
467 | struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) &servaddr; | 468 | struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) &servaddr; |
468 | 469 | ||
469 | daemon->listen_port = ntohs(s6->sin6_port); | 470 | daemon->listen_port = ntohs(s6->sin6_port); |
470 | break; | 471 | break; |
471 | } | 472 | } |
@@ -630,7 +631,7 @@ MHD_polling_thread (void *cls) | |||
630 | MHD_YES); | 631 | MHD_YES); |
631 | break; | 632 | break; |
632 | case MHD_ELS_EPOLL: | 633 | case MHD_ELS_EPOLL: |
633 | #ifdef EPOLL_SUPPORT | 634 | #ifdef EPOLL_SUPPORT |
634 | MHD_daemon_epoll_ (daemon, | 635 | MHD_daemon_epoll_ (daemon, |
635 | MHD_YES); | 636 | MHD_YES); |
636 | #else | 637 | #else |
@@ -643,6 +644,8 @@ MHD_polling_thread (void *cls) | |||
643 | /* Resume any pending for resume connections, join | 644 | /* Resume any pending for resume connections, join |
644 | * all connection's threads (if any) and finally cleanup | 645 | * all connection's threads (if any) and finally cleanup |
645 | * everything. */ | 646 | * everything. */ |
647 | if (! daemon->disallow_suspend_resume) | ||
648 | MHD_resume_suspended_connections_ (daemon); | ||
646 | MHD_daemon_close_all_connections_ (daemon); | 649 | MHD_daemon_close_all_connections_ (daemon); |
647 | 650 | ||
648 | return (MHD_THRD_RTRN_TYPE_)0; | 651 | return (MHD_THRD_RTRN_TYPE_)0; |
@@ -673,13 +676,13 @@ setup_thread_pool (struct MHD_Daemon *daemon) | |||
673 | sizeof (struct MHD_Daemon)); | 676 | sizeof (struct MHD_Daemon)); |
674 | if (NULL == daemon->worker_pool) | 677 | if (NULL == daemon->worker_pool) |
675 | return MHD_SC_THREAD_POOL_MALLOC_FAILURE; | 678 | return MHD_SC_THREAD_POOL_MALLOC_FAILURE; |
676 | 679 | ||
677 | /* Start the workers in the pool */ | 680 | /* Start the workers in the pool */ |
678 | for (i = 0; i < daemon->threading_model; i++) | 681 | for (i = 0; i < daemon->threading_model; i++) |
679 | { | 682 | { |
680 | /* Create copy of the Daemon object for each worker */ | 683 | /* Create copy of the Daemon object for each worker */ |
681 | struct MHD_Daemon *d = &daemon->worker_pool[i]; | 684 | struct MHD_Daemon *d = &daemon->worker_pool[i]; |
682 | 685 | ||
683 | memcpy (d, | 686 | memcpy (d, |
684 | daemon, | 687 | daemon, |
685 | sizeof (struct MHD_Daemon)); | 688 | sizeof (struct MHD_Daemon)); |
@@ -695,8 +698,8 @@ setup_thread_pool (struct MHD_Daemon *daemon) | |||
695 | d->global_connection_limit = conns_per_thread; | 698 | d->global_connection_limit = conns_per_thread; |
696 | if (((unsigned int) i) < leftover_conns) | 699 | if (((unsigned int) i) < leftover_conns) |
697 | ++d->global_connection_limit; | 700 | ++d->global_connection_limit; |
698 | 701 | ||
699 | if (! daemon->disable_itc) | 702 | if (! daemon->disable_itc) |
700 | { | 703 | { |
701 | if (! MHD_itc_init_ (d->itc)) | 704 | if (! MHD_itc_init_ (d->itc)) |
702 | { | 705 | { |
@@ -727,13 +730,13 @@ setup_thread_pool (struct MHD_Daemon *daemon) | |||
727 | { | 730 | { |
728 | MHD_itc_set_invalid_ (d->itc); | 731 | MHD_itc_set_invalid_ (d->itc); |
729 | } | 732 | } |
730 | 733 | ||
731 | #ifdef EPOLL_SUPPORT | 734 | #ifdef EPOLL_SUPPORT |
732 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && | 735 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && |
733 | (MHD_SC_OK != (sc = setup_epoll_to_listen (d))) ) | 736 | (MHD_SC_OK != (sc = setup_epoll_to_listen (d))) ) |
734 | goto thread_failed; | 737 | goto thread_failed; |
735 | #endif | 738 | #endif |
736 | 739 | ||
737 | /* Must init cleanup connection mutex for each worker */ | 740 | /* Must init cleanup connection mutex for each worker */ |
738 | if (! MHD_mutex_init_ (&d->cleanup_connection_mutex)) | 741 | if (! MHD_mutex_init_ (&d->cleanup_connection_mutex)) |
739 | { | 742 | { |
@@ -747,7 +750,7 @@ setup_thread_pool (struct MHD_Daemon *daemon) | |||
747 | sc = MHD_SC_THREAD_POOL_CREATE_MUTEX_FAILURE; | 750 | sc = MHD_SC_THREAD_POOL_CREATE_MUTEX_FAILURE; |
748 | goto thread_failed; | 751 | goto thread_failed; |
749 | } | 752 | } |
750 | 753 | ||
751 | /* Spawn the worker thread */ | 754 | /* Spawn the worker thread */ |
752 | if (! MHD_create_named_thread_ (&d->pid, | 755 | if (! MHD_create_named_thread_ (&d->pid, |
753 | "MHD-worker", | 756 | "MHD-worker", |
@@ -867,10 +870,10 @@ MHD_daemon_start (struct MHD_Daemon *daemon) | |||
867 | return MHD_SC_ITC_DESCRIPTOR_TOO_LARGE; | 870 | return MHD_SC_ITC_DESCRIPTOR_TOO_LARGE; |
868 | } | 871 | } |
869 | } | 872 | } |
870 | 873 | ||
871 | if (MHD_SC_OK != (sc = open_listen_socket (daemon))) | 874 | if (MHD_SC_OK != (sc = open_listen_socket (daemon))) |
872 | return sc; | 875 | return sc; |
873 | 876 | ||
874 | /* Check listen socket is in range (if we are limited) */ | 877 | /* Check listen socket is in range (if we are limited) */ |
875 | if ( (MHD_INVALID_SOCKET != daemon->listen_socket) && | 878 | if ( (MHD_INVALID_SOCKET != daemon->listen_socket) && |
876 | (MHD_ELS_SELECT == daemon->event_loop_syscall) && | 879 | (MHD_ELS_SELECT == daemon->event_loop_syscall) && |
@@ -886,7 +889,7 @@ MHD_daemon_start (struct MHD_Daemon *daemon) | |||
886 | #endif | 889 | #endif |
887 | return MHD_SC_LISTEN_SOCKET_TOO_LARGE; | 890 | return MHD_SC_LISTEN_SOCKET_TOO_LARGE; |
888 | } | 891 | } |
889 | 892 | ||
890 | /* set listen socket to non-blocking */ | 893 | /* set listen socket to non-blocking */ |
891 | if ( (MHD_INVALID_SOCKET != daemon->listen_socket) && | 894 | if ( (MHD_INVALID_SOCKET != daemon->listen_socket) && |
892 | (! MHD_socket_nonblocking_ (daemon->listen_socket)) ) | 895 | (! MHD_socket_nonblocking_ (daemon->listen_socket)) ) |
@@ -907,7 +910,7 @@ MHD_daemon_start (struct MHD_Daemon *daemon) | |||
907 | return MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE; | 910 | return MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE; |
908 | } | 911 | } |
909 | } | 912 | } |
910 | 913 | ||
911 | #ifdef EPOLL_SUPPORT | 914 | #ifdef EPOLL_SUPPORT |
912 | /* Setup epoll */ | 915 | /* Setup epoll */ |
913 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && | 916 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && |
@@ -916,7 +919,7 @@ MHD_daemon_start (struct MHD_Daemon *daemon) | |||
916 | (MHD_SC_OK != (sc = setup_epoll_to_listen (daemon))) ) | 919 | (MHD_SC_OK != (sc = setup_epoll_to_listen (daemon))) ) |
917 | return sc; | 920 | return sc; |
918 | #endif | 921 | #endif |
919 | 922 | ||
920 | /* Setup main listen thread (only if we have no thread pool or | 923 | /* Setup main listen thread (only if we have no thread pool or |
921 | external event loop and do have a listen socket) */ | 924 | external event loop and do have a listen socket) */ |
922 | /* FIXME: why no worker thread if we have no listen socket? */ | 925 | /* FIXME: why no worker thread if we have no listen socket? */ |
@@ -949,7 +952,7 @@ MHD_daemon_start (struct MHD_Daemon *daemon) | |||
949 | 952 | ||
950 | /* make sure we know our listen port (if any) */ | 953 | /* make sure we know our listen port (if any) */ |
951 | get_listen_port_number (daemon); | 954 | get_listen_port_number (daemon); |
952 | 955 | ||
953 | return MHD_SC_OK; | 956 | return MHD_SC_OK; |
954 | } | 957 | } |
955 | 958 | ||
diff --git a/src/lib/request_resume.c b/src/lib/request_resume.c index b4bd651e..8fdffb87 100644 --- a/src/lib/request_resume.c +++ b/src/lib/request_resume.c | |||
@@ -156,9 +156,17 @@ MHD_resume_suspended_connections_ (struct MHD_Daemon *daemon) | |||
156 | #ifdef UPGRADE_SUPPORT | 156 | #ifdef UPGRADE_SUPPORT |
157 | else | 157 | else |
158 | { | 158 | { |
159 | struct MHD_Response *response = pos->request.response; | ||
160 | |||
159 | /* Data forwarding was finished (for TLS connections) AND | 161 | /* Data forwarding was finished (for TLS connections) AND |
160 | * application was closed upgraded connection. | 162 | * application was closed upgraded connection. |
161 | * Insert connection into cleanup list. */ | 163 | * Insert connection into cleanup list. */ |
164 | if ( (NULL != response) && | ||
165 | (MHD_TM_THREAD_PER_CONNECTION != daemon->threading_model) && | ||
166 | (NULL != response->termination_cb) ) | ||
167 | response->termination_cb (response->termination_cb_cls, | ||
168 | MHD_REQUEST_TERMINATED_COMPLETED_OK, | ||
169 | &pos->request.client_context); | ||
162 | DLL_insert (daemon->cleanup_head, | 170 | DLL_insert (daemon->cleanup_head, |
163 | daemon->cleanup_tail, | 171 | daemon->cleanup_tail, |
164 | pos); | 172 | pos); |