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.

Tested x86_64-linux. Committed to trunk.

commit cc9a0a3d79d6abb08753a819c9ea21a25015e962
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Mon Feb 15 15:35:55 2021

    libstdc++: Fix __thread_yield for non-gthreads targets
    
    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.

diff --git a/libstdc++-v3/include/bits/atomic_wait.h 
b/libstdc++-v3/include/bits/atomic_wait.h
index 1a0f0943ebd..37085ae8e50 100644
--- a/libstdc++-v3/include/bits/atomic_wait.h
+++ b/libstdc++-v3/include/bits/atomic_wait.h
@@ -213,24 +213,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { _M_w._M_do_wait(_M_version); }
     };
 
-    inline void
-    __thread_relax() noexcept
-    {
-#if defined __i386__ || defined __x86_64__
-      __builtin_ia32_pause();
-#elif defined _GLIBCXX_USE_SCHED_YIELD
-      __gthread_yield();
-#endif
-    }
-
     inline void
     __thread_yield() noexcept
     {
-#if defined _GLIBCXX_USE_SCHED_YIELD
+#if defined _GLIBCXX_HAS_GTHREADS && defined _GLIBCXX_USE_SCHED_YIELD
      __gthread_yield();
 #endif
     }
 
+    inline void
+    __thread_relax() noexcept
+    {
+#if defined __i386__ || defined __x86_64__
+      __builtin_ia32_pause();
+#else
+      __gthread_yield();
+#endif
+    }
   } // namespace __detail
 
   template<typename _Pred>

Reply via email to