aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/daemon_destroy.c15
-rw-r--r--src/lib/daemon_start.c51
-rw-r--r--src/lib/request_resume.c8
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);