]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: thread: implement ha_thread_relax()
authorWilly Tarreau <w@1wt.eu>
Fri, 17 May 2019 14:33:13 +0000 (16:33 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 17 May 2019 15:16:20 +0000 (17:16 +0200)
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
src/hathreads.c

index a1a7fae8268c9c6f558f23fdeac2f2e505b9e620..806746770e1b3ad33cb06c69d1374e4b3ad521a3 100644 (file)
 #ifndef _COMMON_HATHREADS_H
 #define _COMMON_HATHREADS_H
 
+#include <unistd.h>
+#ifdef _POSIX_PRIORITY_SCHEDULING
+#include <sched.h>
+#endif
+
 #include <common/config.h>
 #include <common/initcall.h>
 
@@ -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
index 686edca8e4cd4bd70288fca0a0574d844bd92dbf..fc17318672bd56a0e7c894e99cc29149568d8461 100644 (file)
@@ -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