From fc69e410e605677be567ee43464424ad9336840f Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 28 Sep 2021 08:58:49 +0200 Subject: [PATCH] MINOR: threads: make tg point to the current thread's group A the "tg" thread-local variable now always points to the current thread group. It's pre-initializd to the first one during boot and is set to point to the thread's one by ha_set_tid(). This last one takes care of checking whether the thread group was assigned or not because it may be called during boot before threads are initialized. --- include/haproxy/thread.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/haproxy/thread.h b/include/haproxy/thread.h index 37808d9..14c88f0 100644 --- a/include/haproxy/thread.h +++ b/include/haproxy/thread.h @@ -90,6 +90,7 @@ enum { tid = 0 }; static inline void ha_set_tid(unsigned int tid) { ti = &ha_thread_info[tid]; + tg = ti->tg ? ti->tg : &ha_tgroup_info[0]; th_ctx = &ha_thread_ctx[tid]; } @@ -201,12 +202,17 @@ extern THREAD_LOCAL unsigned int tid; /* The thread id */ #define ha_sigmask(how, set, oldset) pthread_sigmask(how, set, oldset) -/* sets the thread ID and the TID bit for the current thread */ +/* sets the thread ID, TID bit and thread cfg/ctx pointers for the current + * thread. Since it may be called during early boot even before threads are + * initialized, we have to be extra careful about some fields which may still + * be null. For example tg may be null during a part of the boot. + */ static inline void ha_set_tid(unsigned int data) { tid = data; tid_bit = (1UL << tid); ti = &ha_thread_info[tid]; + tg = ti->tg ? ti->tg : &ha_tgroup_info[0]; th_ctx = &ha_thread_ctx[tid]; } -- 1.7.10.4