From cc0c18d82f2475507ef46a0f049bbd30d122807e Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 14 Aug 2026 16:33:10 +0200 Subject: [PATCH] BUG/MEDIUM: pollers: create the poller pipes in builds without threads Commit 5f548bc8e ("MEDIUM: pollers: Create the poller pipes before we create the thread") creates them from setup_extra_threads(), which is an empty stub when built without threads (e.g. TARGET=generic). The pipes then stay uninitialized and each thread inserts fd 0 twice, hitting BUG_ON(fdtab[fd].owner != NULL) at boot. Move the call to haproxy.c just before setup_extra_threads() so that all builds share the same path. --- src/haproxy.c | 12 ++++++++++++ src/thread.c | 10 ---------- 2 files changed, 12 insertions(+), 10 deletions(-) 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. -- 2.47.3