]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: thread: add is_thread_harmless() to know if a thread already is harmless
authorWilly Tarreau <w@1wt.eu>
Fri, 1 Jul 2022 15:11:03 +0000 (17:11 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 1 Jul 2022 17:26:35 +0000 (19:26 +0200)
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
src/debug.c

index 3ce436a1113687614550296441683494d3d75c42..fe2312756693f32e5d3feca9f7cb3b4163fd8d1a 100644 (file)
@@ -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
index 7b0711e0870c245792ed7d1f0054b9eb93c0f1b0..3abcc0f00bf09e3714b3ae3698b1d2029e984997 100644 (file)
@@ -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);
 }