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.
This commit is contained in:
parent
8b35ba54bc
commit
2beaaf7d46
|
@ -22,6 +22,7 @@
|
|||
#ifndef _COMMON_HATHREADS_H
|
||||
#define _COMMON_HATHREADS_H
|
||||
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#ifdef _POSIX_PRIORITY_SCHEDULING
|
||||
#include <sched.h>
|
||||
|
@ -157,6 +158,18 @@ static inline void ha_thread_relax(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* send signal <sig> to thread <thr> */
|
||||
static inline void ha_tkill(unsigned int thr, int sig)
|
||||
{
|
||||
raise(sig);
|
||||
}
|
||||
|
||||
/* send signal <sig> 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;
|
||||
|
|
|
@ -97,6 +97,29 @@ void thread_release()
|
|||
thread_harmless_end();
|
||||
}
|
||||
|
||||
/* send signal <sig> to thread <thr> */
|
||||
void ha_tkill(unsigned int thr, int sig)
|
||||
{
|
||||
pthread_kill(thread_info[thr].pthread, sig);
|
||||
}
|
||||
|
||||
/* send signal <sig> 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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue