diff options
Diffstat (limited to 'src/lib/daemon_destroy.c')
-rw-r--r-- | src/lib/daemon_destroy.c | 158 |
1 files changed, 80 insertions, 78 deletions
diff --git a/src/lib/daemon_destroy.c b/src/lib/daemon_destroy.c index b4f34d16..a76c2d6b 100644 --- a/src/lib/daemon_destroy.c +++ b/src/lib/daemon_destroy.c | |||
@@ -46,35 +46,36 @@ stop_workers (struct MHD_Daemon *daemon) | |||
46 | fd = daemon->listen_socket; | 46 | fd = daemon->listen_socket; |
47 | /* Let workers shutdown in parallel. */ | 47 | /* Let workers shutdown in parallel. */ |
48 | for (i = 0; i < daemon->worker_pool_size; i++) | 48 | for (i = 0; i < daemon->worker_pool_size; i++) |
49 | { | ||
50 | daemon->worker_pool[i].shutdown = true; | ||
51 | if (MHD_ITC_IS_VALID_ (daemon->worker_pool[i].itc)) | ||
49 | { | 52 | { |
50 | daemon->worker_pool[i].shutdown = true; | 53 | if (! MHD_itc_activate_ (daemon->worker_pool[i].itc, |
51 | if (MHD_ITC_IS_VALID_(daemon->worker_pool[i].itc)) | 54 | "e")) |
52 | { | 55 | MHD_PANIC (_ ( |
53 | if (! MHD_itc_activate_ (daemon->worker_pool[i].itc, | 56 | "Failed to signal shutdown via inter-thread communication channel.")); |
54 | "e")) | ||
55 | MHD_PANIC (_("Failed to signal shutdown via inter-thread communication channel.")); | ||
56 | } | ||
57 | else | ||
58 | { | ||
59 | /* Better hope shutdown() works... */ | ||
60 | mhd_assert (MHD_INVALID_SOCKET != fd); | ||
61 | } | ||
62 | } | 57 | } |
63 | #ifdef HAVE_LISTEN_SHUTDOWN | 58 | else |
64 | if (MHD_INVALID_SOCKET != fd) | ||
65 | { | 59 | { |
66 | (void) shutdown (fd, | 60 | /* Better hope shutdown() works... */ |
67 | SHUT_RDWR); | 61 | mhd_assert (MHD_INVALID_SOCKET != fd); |
68 | } | 62 | } |
63 | } | ||
64 | #ifdef HAVE_LISTEN_SHUTDOWN | ||
65 | if (MHD_INVALID_SOCKET != fd) | ||
66 | { | ||
67 | (void) shutdown (fd, | ||
68 | SHUT_RDWR); | ||
69 | } | ||
69 | #endif /* HAVE_LISTEN_SHUTDOWN */ | 70 | #endif /* HAVE_LISTEN_SHUTDOWN */ |
70 | for (i = 0; i < daemon->worker_pool_size; ++i) | 71 | for (i = 0; i < daemon->worker_pool_size; ++i) |
71 | { | 72 | { |
72 | MHD_daemon_destroy (&daemon->worker_pool[i]); | 73 | MHD_daemon_destroy (&daemon->worker_pool[i]); |
73 | } | 74 | } |
74 | free (daemon->worker_pool); | 75 | free (daemon->worker_pool); |
75 | daemon->worker_pool = NULL; | 76 | daemon->worker_pool = NULL; |
76 | /* FIXME: does this still hold? */ | 77 | /* FIXME: does this still hold? */ |
77 | mhd_assert (MHD_ITC_IS_INVALID_(daemon->itc)); | 78 | mhd_assert (MHD_ITC_IS_INVALID_ (daemon->itc)); |
78 | #ifdef EPOLL_SUPPORT | 79 | #ifdef EPOLL_SUPPORT |
79 | mhd_assert (-1 == daemon->epoll_fd); | 80 | mhd_assert (-1 == daemon->epoll_fd); |
80 | #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) | 81 | #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) |
@@ -104,65 +105,66 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
104 | /* FIXME: convert from here to microhttpd2-style API! */ | 105 | /* FIXME: convert from here to microhttpd2-style API! */ |
105 | 106 | ||
106 | if (NULL != daemon->worker_pool) | 107 | if (NULL != daemon->worker_pool) |
107 | { /* Master daemon with worker pool. */ | 108 | { /* Master daemon with worker pool. */ |
108 | stop_workers (daemon); | 109 | stop_workers (daemon); |
109 | } | 110 | } |
110 | else | 111 | else |
112 | { | ||
113 | mhd_assert (0 == daemon->worker_pool_size); | ||
114 | /* Worker daemon or single-thread daemon. */ | ||
115 | if (MHD_TM_EXTERNAL_EVENT_LOOP != daemon->threading_mode) | ||
111 | { | 116 | { |
112 | mhd_assert (0 == daemon->worker_pool_size); | 117 | /* Worker daemon or single daemon with internal thread(s). */ |
113 | /* Worker daemon or single-thread daemon. */ | 118 | /* Separate thread(s) is used for polling sockets. */ |
114 | if (MHD_TM_EXTERNAL_EVENT_LOOP != daemon->threading_mode) | 119 | if (MHD_ITC_IS_VALID_ (daemon->itc)) |
115 | { | 120 | { |
116 | /* Worker daemon or single daemon with internal thread(s). */ | 121 | if (! MHD_itc_activate_ (daemon->itc, |
117 | /* Separate thread(s) is used for polling sockets. */ | 122 | "e")) |
118 | if (MHD_ITC_IS_VALID_(daemon->itc)) | 123 | MHD_PANIC (_ ( |
119 | { | 124 | "Failed to signal shutdown via inter-thread communication channel")); |
120 | if (! MHD_itc_activate_ (daemon->itc, | 125 | } |
121 | "e")) | ||
122 | MHD_PANIC (_("Failed to signal shutdown via inter-thread communication channel")); | ||
123 | } | ||
124 | else | ||
125 | { | ||
126 | #ifdef HAVE_LISTEN_SHUTDOWN | ||
127 | if (MHD_INVALID_SOCKET != fd) | ||
128 | { | ||
129 | if (NULL == daemon->master) | ||
130 | (void) shutdown (fd, | ||
131 | SHUT_RDWR); | ||
132 | } | ||
133 | else | ||
134 | #endif /* HAVE_LISTEN_SHUTDOWN */ | ||
135 | mhd_assert (false); /* Should never happen */ | ||
136 | } | ||
137 | |||
138 | if (! MHD_join_thread_ (daemon->pid.handle)) | ||
139 | { | ||
140 | MHD_PANIC (_("Failed to join a thread\n")); | ||
141 | } | ||
142 | /* close_all_connections() was called in daemon thread. */ | ||
143 | } | ||
144 | else | 126 | else |
127 | { | ||
128 | #ifdef HAVE_LISTEN_SHUTDOWN | ||
129 | if (MHD_INVALID_SOCKET != fd) | ||
145 | { | 130 | { |
146 | /* No internal threads are used for polling sockets | 131 | if (NULL == daemon->master) |
147 | (external event loop) */ | 132 | (void) shutdown (fd, |
148 | MHD_daemon_close_all_connections_ (daemon); | 133 | SHUT_RDWR); |
149 | } | 134 | } |
150 | if (MHD_ITC_IS_VALID_ (daemon->itc)) | 135 | else |
151 | MHD_itc_destroy_chk_ (daemon->itc); | 136 | #endif /* HAVE_LISTEN_SHUTDOWN */ |
137 | mhd_assert (false); /* Should never happen */ | ||
138 | } | ||
139 | |||
140 | if (! MHD_join_thread_ (daemon->pid.handle)) | ||
141 | { | ||
142 | MHD_PANIC (_ ("Failed to join a thread\n")); | ||
143 | } | ||
144 | /* close_all_connections() was called in daemon thread. */ | ||
145 | } | ||
146 | else | ||
147 | { | ||
148 | /* No internal threads are used for polling sockets | ||
149 | (external event loop) */ | ||
150 | MHD_daemon_close_all_connections_ (daemon); | ||
151 | } | ||
152 | if (MHD_ITC_IS_VALID_ (daemon->itc)) | ||
153 | MHD_itc_destroy_chk_ (daemon->itc); | ||
152 | 154 | ||
153 | #ifdef EPOLL_SUPPORT | 155 | #ifdef EPOLL_SUPPORT |
154 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && | 156 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && |
155 | (-1 != daemon->epoll_fd) ) | 157 | (-1 != daemon->epoll_fd) ) |
156 | MHD_socket_close_chk_ (daemon->epoll_fd); | 158 | MHD_socket_close_chk_ (daemon->epoll_fd); |
157 | #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) | 159 | #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) |
158 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && | 160 | if ( (MHD_ELS_EPOLL == daemon->event_loop_syscall) && |
159 | (-1 != daemon->epoll_upgrade_fd) ) | 161 | (-1 != daemon->epoll_upgrade_fd) ) |
160 | MHD_socket_close_chk_ (daemon->epoll_upgrade_fd); | 162 | MHD_socket_close_chk_ (daemon->epoll_upgrade_fd); |
161 | #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ | 163 | #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ |
162 | #endif /* EPOLL_SUPPORT */ | 164 | #endif /* EPOLL_SUPPORT */ |
163 | 165 | ||
164 | MHD_mutex_destroy_chk_ (&daemon->cleanup_connection_mutex); | 166 | MHD_mutex_destroy_chk_ (&daemon->cleanup_connection_mutex); |
165 | } | 167 | } |
166 | 168 | ||
167 | if (NULL != daemon->master) | 169 | if (NULL != daemon->master) |
168 | return; | 170 | return; |
@@ -175,18 +177,18 @@ MHD_daemon_destroy (struct MHD_Daemon *daemon) | |||
175 | /* TLS clean up */ | 177 | /* TLS clean up */ |
176 | #ifdef HTTPS_SUPPORT | 178 | #ifdef HTTPS_SUPPORT |
177 | if (NULL != daemon->tls_api) | 179 | if (NULL != daemon->tls_api) |
178 | { | 180 | { |
179 | #if FIXME_TLS_API | 181 | #if FIXME_TLS_API |
180 | if (daemon->have_dhparams) | 182 | if (daemon->have_dhparams) |
181 | { | 183 | { |
182 | gnutls_dh_params_deinit (daemon->https_mem_dhparams); | 184 | gnutls_dh_params_deinit (daemon->https_mem_dhparams); |
183 | daemon->have_dhparams = false; | 185 | daemon->have_dhparams = false; |
184 | } | ||
185 | gnutls_priority_deinit (daemon->priority_cache); | ||
186 | if (daemon->x509_cred) | ||
187 | gnutls_certificate_free_credentials (daemon->x509_cred); | ||
188 | #endif | ||
189 | } | 186 | } |
187 | gnutls_priority_deinit (daemon->priority_cache); | ||
188 | if (daemon->x509_cred) | ||
189 | gnutls_certificate_free_credentials (daemon->x509_cred); | ||
190 | #endif | ||
191 | } | ||
190 | #endif /* HTTPS_SUPPORT */ | 192 | #endif /* HTTPS_SUPPORT */ |
191 | 193 | ||
192 | #ifdef DAUTH_SUPPORT | 194 | #ifdef DAUTH_SUPPORT |