From a2b8ed4b440786eefaf6f783a5a003c3f079126a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 1 Jul 2022 17:11:03 +0200 Subject: [PATCH] MINOR: thread: add is_thread_harmless() to know if a thread already is harmless The harmless status is not re-entrant, so sometimes for signal handling it can be useful to know if we're already harmless or not. Let's add a function doing that, and make the debugger use it instead of manipulating the harmless mask. --- include/haproxy/thread.h | 11 +++++++++++ src/debug.c | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/haproxy/thread.h b/include/haproxy/thread.h index 3ce436a11..fe2312756 100644 --- a/include/haproxy/thread.h +++ b/include/haproxy/thread.h @@ -116,6 +116,11 @@ static inline void thread_harmless_now() { } +static inline int is_thread_harmless() +{ + return 1; +} + static inline void thread_harmless_end() { } @@ -251,6 +256,12 @@ static inline void thread_harmless_now() HA_ATOMIC_OR(&tg_ctx->threads_harmless, ti->ltid_bit); } +/* Returns non-zero if the current thread is already harmless */ +static inline int is_thread_harmless() +{ + return !!(HA_ATOMIC_LOAD(&tg_ctx->threads_harmless) & ti->ltid_bit); +} + /* Ends the harmless period started by thread_harmless_now(). Usually this is * placed after the poll() call. If it is discovered that a job was running and * is relying on the thread still being harmless, the thread waits for the diff --git a/src/debug.c b/src/debug.c index 7b0711e08..3abcc0f00 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1323,6 +1323,8 @@ void ha_thread_dump_all_to_trash() /* handles DEBUGSIG to dump the state of the thread it's working on */ void debug_handler(int sig, siginfo_t *si, void *arg) { + int harmless = is_thread_harmless(); + /* first, let's check it's really for us and that we didn't just get * a spurious DEBUGSIG. */ @@ -1366,7 +1368,7 @@ void debug_handler(int sig, siginfo_t *si, void *arg) /* mark the current thread as stuck to detect it upon next invocation * if it didn't move. */ - if (!(_HA_ATOMIC_LOAD(&tg_ctx->threads_harmless) & ti->ltid_bit) && + if (!harmless && !(_HA_ATOMIC_LOAD(&th_ctx->flags) & TH_FL_SLEEPING)) _HA_ATOMIC_OR(&th_ctx->flags, TH_FL_STUCK); }