libstdc++: Fix __thread_yield for non-gthreads targets
authorJonathan Wakely <jwakely@redhat.com>
Mon, 15 Feb 2021 15:35:55 +0000 (15:35 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 15 Feb 2021 15:52:25 +0000 (15:52 +0000)
The __gthread_yield() function is only defined for gthreads targets, so
check _GLIBCXX_HAS_GTHREADS before using it.

Also reorder __thread_relax and __thread_yield so that the former can
use the latter instead of repeating the same preprocessor checks.

libstdc++-v3/ChangeLog:

* include/bits/atomic_wait.h (__thread_yield()): Check
_GLIBCXX_HAS_GTHREADS before using __gthread_yield.
(__thread_relax()): Use __thread_yield() instead of repeating
the preprocessor checks for __gthread_yield.

libstdc++-v3/include/bits/atomic_wait.h

index 1a0f0943ebda6ca5fa541dde368cb26af2f5c930..37085ae8e50e63f8d48a894663c9f7606b435038 100644 (file)
@@ -214,23 +214,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     };
 
     inline void
-    __thread_relax() noexcept
+    __thread_yield() noexcept
     {
-#if defined __i386__ || defined __x86_64__
-      __builtin_ia32_pause();
-#elif defined _GLIBCXX_USE_SCHED_YIELD
-      __gthread_yield();
+#if defined _GLIBCXX_HAS_GTHREADS && defined _GLIBCXX_USE_SCHED_YIELD
+     __gthread_yield();
 #endif
     }
 
     inline void
-    __thread_yield() noexcept
+    __thread_relax() noexcept
     {
-#if defined _GLIBCXX_USE_SCHED_YIELD
-     __gthread_yield();
+#if defined __i386__ || defined __x86_64__
+      __builtin_ia32_pause();
+#else
+      __gthread_yield();
 #endif
     }
-
   } // namespace __detail
 
   template<typename _Pred>