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