From: Olivier Houchard Date: Tue, 18 Aug 2026 12:31:00 +0000 (+0200) Subject: BUG/MEDIUM: pollers: really create the poller pipes in builds without threads X-Git-Tag: v3.5-dev5~16 X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=c71f45a0a48b0f914f238b770631e6792f6ed917;p=haproxy.git BUG/MEDIUM: pollers: really create the poller pipes in builds without threads Commit c5f41118c ("BUG/MEDIUM: tasks: don't type-pun state and tid in builds without threads") was mangled when committed: instead of the task fix its message describes, its content accidentally reverted commit cc0c18d82 ("BUG/MEDIUM: pollers: create the poller pipes in builds without threads"), moving the fd_precreate_poller_pipes() call back into setup_extra_threads(), an empty stub without threads. Builds made with USE_THREAD unset (e.g. TARGET=generic) thus abort again on startup on BUG_ON(fdtab[fd].owner) when inserting the poller pipes. Move the call back to haproxy.c, right before setup_extra_threads(), so that all builds share the same path. --- diff --git a/src/haproxy.c b/src/haproxy.c index 373429007..801bc6dfe 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3946,6 +3946,18 @@ int main(int argc, char **argv) } } + /* When FD tables are not shared between thread groups, the poller + * pipes of all threads must be created before any group unshares its + * FD table, so that they are inherited into every group's table and + * cross-group wake_thread() keeps working. This must be done for all + * builds, including those without threads, since each thread will pick + * its own pair from there. + */ + if (!fd_precreate_poller_pipes()) { + ha_alert("Failed to create the poller pipes.\n"); + exit(1); + } + /* start threads 2 and above */ setup_extra_threads(&run_thread_poll_loop); diff --git a/src/thread.c b/src/thread.c index 557af60fb..3a6efe482 100644 --- a/src/thread.c +++ b/src/thread.c @@ -278,16 +278,6 @@ void setup_extra_threads(void *(*handler)(void *)) /* the startup thread will be thread 1 */ ha_pthread[0] = pthread_self(); - /* When FD tables are not shared between thread groups, the poller - * pipes of all threads must be created before any group unshares its - * FD table, so that they are inherited into every group's table and - * cross-group wake_thread() keeps working. - */ - if (!fd_precreate_poller_pipes()) { - ha_alert("Failed to create the poller pipes.\n"); - exit(1); - } - /* Create one initial thread for each extra thread group. These will * each be responsible for creating their own extra threads. The first * group's initial thread is the current thread.