libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

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:
Msrc/mhd2/daemon_start.c | 28+++++++++++-----------------
Msrc/mhd2/mhd_daemon.h | 20+++++++++++++++++++-
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