commit 29316be58e1fd755fd68a012b09d1fd0eaa1e9f7
parent a71d58c12a37632d04cf46d2d5b5c78cac0afc9c
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Fri, 1 Aug 2025 17:52:54 +0200
Reduced binary size when built without threads
Diffstat:
2 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/src/mhd2/daemon_start.c b/src/mhd2/daemon_start.c
@@ -1216,12 +1216,12 @@ static MHD_FN_PAR_NONNULL_ (1) enum MHD_StatusCode
init_epoll (struct MHD_Daemon *restrict d)
{
int e_fd;
- mhd_assert (mhd_WM_INT_INTERNAL_EVENTS_THREAD_PER_CONNECTION != d->wmode_int);
+ mhd_assert (! mhd_WM_INT_IS_THREAD_PER_CONN (d->wmode_int));
mhd_assert ((mhd_POLL_TYPE_NOT_SET_YET == d->events.poll_type) || \
((mhd_POLL_TYPE_EPOLL == d->events.poll_type) && \
- (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == d->wmode_int)));
+ (mhd_WM_INT_IS_THREAD_POOL (d->wmode_int))));
mhd_assert ((! d->dbg.net_inited) || \
- (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == d->wmode_int));
+ (mhd_WM_INT_IS_THREAD_POOL (d->wmode_int)));
mhd_assert ((mhd_POLL_TYPE_EPOLL != d->events.poll_type) || \
(NULL == d->events.data.epoll.events));
mhd_assert ((mhd_POLL_TYPE_EPOLL != d->events.poll_type) || \
@@ -1270,7 +1270,7 @@ deinit_epoll (struct MHD_Daemon *restrict d)
/* With thread pool the epoll control FD could be migrated to the
* first worker daemon. */
mhd_assert ((MHD_INVALID_SOCKET != d->events.data.epoll.e_fd) || \
- (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == d->wmode_int));
+ (mhd_WM_INT_IS_THREAD_POOL (d->wmode_int)));
mhd_assert ((MHD_INVALID_SOCKET != d->events.data.epoll.e_fd) || \
(mhd_D_HAS_WORKERS (d)));
if (MHD_INVALID_SOCKET != d->events.data.epoll.e_fd)
@@ -1377,8 +1377,7 @@ daemon_choose_and_preinit_events (struct MHD_Daemon *restrict d,
fallback_syscall_allowed = false;
chosen_type = mhd_POLL_TYPE_EPOLL; /* without fallback */
}
- else if ((mhd_WM_INT_INTERNAL_EVENTS_THREAD_PER_CONNECTION !=
- d->wmode_int) &&
+ else if ((! mhd_WM_INT_IS_THREAD_PER_CONN (d->wmode_int)) &&
(edge_trig_allowed))
chosen_type = mhd_POLL_TYPE_EPOLL; /* with possible fallback */
#endif
@@ -1402,8 +1401,7 @@ daemon_choose_and_preinit_events (struct MHD_Daemon *restrict d,
{
enum MHD_StatusCode epoll_res;
- mhd_assert (mhd_WM_INT_INTERNAL_EVENTS_THREAD_PER_CONNECTION != \
- d->wmode_int);
+ mhd_assert (! mhd_WM_INT_IS_THREAD_PER_CONN (d->wmode_int));
epoll_res = init_epoll (d);
if (MHD_SC_OK != epoll_res)
@@ -1553,7 +1551,7 @@ daemon_init_net (struct MHD_Daemon *restrict d,
if ((MHD_INVALID_SOCKET != d->net.listen.fd)
&& ! d->net.listen.non_block
&& (mhd_D_IS_USING_EDGE_TRIG (d) ||
- (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == d->wmode_int)))
+ mhd_WM_INT_IS_THREAD_POOL (d->wmode_int)))
{
mhd_LOG_MSG (d, MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE, \
"The selected daemon work mode requires listening socket "
@@ -2593,6 +2591,8 @@ set_connections_total_limits (struct MHD_Daemon *restrict d,
mhd_assert (! mhd_D_HAS_MASTER (d));
mhd_assert (mhd_D_TYPE_IS_VALID (d->threading.d_type));
+ num_worker_daemons = 1;
+#ifdef MHD_SUPPORT_THREADS
if (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == d->wmode_int)
{
mhd_assert (MHD_WM_WORKER_THREADS == s->work_mode.mode);
@@ -2607,8 +2607,6 @@ set_connections_total_limits (struct MHD_Daemon *restrict d,
return MHD_SC_CONFIGURATION_CONN_LIMIT_TOO_SMALL;
}
}
- num_worker_daemons = 1;
-#ifdef MHD_SUPPORT_THREADS
if (mhd_D_TYPE_HAS_WORKERS (d->threading.d_type))
num_worker_daemons = s->work_mode.params.num_worker_threads;
#endif /* MHD_SUPPORT_THREADS */
@@ -2790,11 +2788,7 @@ set_d_threading_type (struct MHD_Daemon *restrict d)
mhd_assert (mhd_POLL_TYPE_EXT != d->events.poll_type);
d->threading.d_type = mhd_DAEMON_TYPE_MASTER_CONTROL_ONLY;
return MHD_SC_OK;
-#else /* ! MHD_SUPPORT_THREADS */
- case mhd_WM_INT_INTERNAL_EVENTS_ONE_THREAD:
- case mhd_WM_INT_INTERNAL_EVENTS_THREAD_PER_CONNECTION:
- case mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL:
-#endif /* ! MHD_SUPPORT_THREADS */
+#endif /* MHD_SUPPORT_THREADS */
default:
break;
}
@@ -3063,7 +3057,7 @@ daemon_deinit_threading_and_conn (struct MHD_Daemon *restrict d)
mhd_assert (! mhd_D_TYPE_IS_INTERNAL_ONLY (d->threading.d_type));
if (! mhd_D_TYPE_HAS_WORKERS (d->threading.d_type))
{
- mhd_assert (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL != d->wmode_int);
+ mhd_assert (! mhd_WM_INT_IS_THREAD_POOL (d->wmode_int));
mhd_assert (d->dbg.connections_inited);
mhd_assert (d->dbg.events_allocated);
mhd_assert (! d->dbg.thread_pool_inited);
diff --git a/src/mhd2/mhd_daemon.h b/src/mhd2/mhd_daemon.h
@@ -138,6 +138,7 @@ enum MHD_FIXED_ENUM_ mhd_WorkModeIntType
* No threads managed by the daemon.
*/
mhd_WM_INT_INTERNAL_EVENTS_NO_THREADS
+#ifdef MHD_SUPPORT_THREADS
,
/**
* The daemon runs its own single thread, where the daemon monitors
@@ -160,14 +161,31 @@ enum MHD_FIXED_ENUM_ mhd_WorkModeIntType
* process the network data).
*/
mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL
+#endif
};
+#ifdef MHD_SUPPORT_THREADS
/**
* Check whether given mhd_WorkModeIntType value should have internal threads,
* either directly controlled or indirectly, via additional workers daemons.
*/
-#define mhd_WM_INT_HAS_THREADS(wm_i) \
+# define mhd_WM_INT_HAS_THREADS(wm_i) \
(mhd_WM_INT_INTERNAL_EVENTS_ONE_THREAD <= wm_i)
+/**
+ * Check whether given mhd_WorkModeIntType value equals "thread-per-connection"
+ */
+# define mhd_WM_INT_IS_THREAD_PER_CONN(wm_i) \
+ (mhd_WM_INT_INTERNAL_EVENTS_THREAD_PER_CONNECTION == wm_i)
+/**
+ * Check whether given mhd_WorkModeIntType value equals "thread pool"
+ */
+# define mhd_WM_INT_IS_THREAD_POOL(wm_i) \
+ (mhd_WM_INT_INTERNAL_EVENTS_THREAD_POOL == wm_i)
+#else /* ! MHD_SUPPORT_THREADS */
+# define mhd_WM_INT_HAS_THREADS(wm_i) (0)
+# define mhd_WM_INT_IS_THREAD_PER_CONN(wm_i) (0)
+# define mhd_WM_INT_IS_THREAD_POOL(wm_i) (0)
+#endif /* ! MHD_SUPPORT_THREADS */
/**
* Check whether given mhd_WorkModeIntType value has external events