From 38171daf21f687067ff93d7b557a40527f699f5b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 17 May 2019 16:33:13 +0200 Subject: [PATCH] MINOR: thread: implement ha_thread_relax() At some places we're using a painful ifdef to decide whether to use sched_yield() or pl_cpu_relax() to relax in loops, this is hardly exportable. Let's move this to ha_thread_relax() instead and une this one only. --- include/common/hathreads.h | 21 +++++++++++++++++++++ src/hathreads.c | 12 ++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/include/common/hathreads.h b/include/common/hathreads.h index a1a7fae82..806746770 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -22,6 +22,11 @@ #ifndef _COMMON_HATHREADS_H #define _COMMON_HATHREADS_H +#include +#ifdef _POSIX_PRIORITY_SCHEDULING +#include +#endif + #include #include @@ -130,6 +135,13 @@ static inline void ha_set_tid(unsigned int tid) { } +static inline void ha_thread_relax(void) +{ +#if _POSIX_PRIORITY_SCHEDULING + sched_yield(); +#endif +} + static inline void __ha_barrier_atomic_load(void) { } @@ -391,6 +403,15 @@ static inline void ha_set_tid(unsigned int data) tid_bit = (1UL << tid); } +static inline void ha_thread_relax(void) +{ +#if _POSIX_PRIORITY_SCHEDULING + sched_yield(); +#else + pl_cpu_relax(); +#endif +} + /* Marks the thread as harmless. Note: this must be true, i.e. the thread must * not be touching any unprotected shared resource during this period. Usually * this is called before poll(), but it may also be placed around very slow diff --git a/src/hathreads.c b/src/hathreads.c index 686edca8e..fc1731867 100644 --- a/src/hathreads.c +++ b/src/hathreads.c @@ -52,11 +52,7 @@ void thread_harmless_till_end() { _HA_ATOMIC_OR(&threads_harmless_mask, tid_bit); while (threads_want_rdv_mask & all_threads_mask) { -#if _POSIX_PRIORITY_SCHEDULING - sched_yield(); -#else - pl_cpu_relax(); -#endif + ha_thread_relax(); } } @@ -81,11 +77,7 @@ void thread_isolate() else if (_HA_ATOMIC_CAS(&threads_harmless_mask, &old, old & ~tid_bit)) break; -#if _POSIX_PRIORITY_SCHEDULING - sched_yield(); -#else - pl_cpu_relax(); -#endif + ha_thread_relax(); } /* one thread gets released at a time here, with its harmess bit off. * The loss of this bit makes the other one continue to spin while the