From: Willy Tarreau Date: Wed, 22 May 2019 06:43:34 +0000 (+0200) Subject: MINOR: threads: implement ha_tkill() and ha_tkillall() X-Git-Tag: v2.0-dev4~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2beaaf7d4622782de05300c141fc74fd8b145dc2;p=thirdparty%2Fhaproxy.git MINOR: threads: implement ha_tkill() and ha_tkillall() These functions are used respectively to signal one thread or all threads. When multithreading is disabled, it's always the current thread which is signaled. --- diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 0bc6e4505e..77bd617aa8 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -22,6 +22,7 @@ #ifndef _COMMON_HATHREADS_H #define _COMMON_HATHREADS_H +#include #include #ifdef _POSIX_PRIORITY_SCHEDULING #include @@ -157,6 +158,18 @@ static inline void ha_thread_relax(void) #endif } +/* send signal to thread */ +static inline void ha_tkill(unsigned int thr, int sig) +{ + raise(sig); +} + +/* send signal to all threads */ +static inline void ha_tkillall(int sig) +{ + raise(sig); +} + static inline void __ha_barrier_atomic_load(void) { } @@ -383,6 +396,8 @@ static inline unsigned long thread_isolated() void thread_harmless_till_end(); void thread_isolate(); void thread_release(); +void ha_tkill(unsigned int thr, int sig); +void ha_tkillall(int sig); extern struct thread_info { pthread_t pthread; diff --git a/src/hathreads.c b/src/hathreads.c index b25417cc89..8359dd5ebb 100644 --- a/src/hathreads.c +++ b/src/hathreads.c @@ -97,6 +97,29 @@ void thread_release() thread_harmless_end(); } +/* send signal to thread */ +void ha_tkill(unsigned int thr, int sig) +{ + pthread_kill(thread_info[thr].pthread, sig); +} + +/* send signal to all threads. The calling thread is signaled last in + * order to allow all threads to synchronize in the handler. + */ +void ha_tkillall(int sig) +{ + unsigned int thr; + + for (thr = 0; thr < global.nbthread; thr++) { + if (!(all_threads_mask & (1UL << thr))) + continue; + if (thr == tid) + continue; + pthread_kill(thread_info[thr].pthread, sig); + } + raise(sig); +} + /* these calls are used as callbacks at init time */ void ha_spin_init(HA_SPINLOCK_T *l) {