Remove binary_semaphore implementation from stop_token

Message ID 20200606212651.1611233-1-rodgert@appliantology.com
State New
Headers show
Series
  • Remove binary_semaphore implementation from stop_token
Related show

Commit Message

Thomas Rodgers June 6, 2020, 9:26 p.m.
* include/std/stop_token: Remove local binary_semaphore implementation.
          (_Stop_state_t::_M_do_try_lock): Use __thread_yield() from
          bits/atomic_wait.h.
---
 libstdc++-v3/include/std/stop_token | 40 ++---------------------------
 1 file changed, 2 insertions(+), 38 deletions(-)

-- 
2.26.2

Patch

diff --git a/libstdc++-v3/include/std/stop_token b/libstdc++-v3/include/std/stop_token
index 847d12f7454..40a71574a7e 100644
--- a/libstdc++-v3/include/std/stop_token
+++ b/libstdc++-v3/include/std/stop_token
@@ -36,9 +36,7 @@ 
 #ifdef _GLIBCXX_HAS_GTHREADS
 # define __cpp_lib_jthread 201911L
 # include <bits/gthr.h>
-# if __has_include(<semaphore>)
-#  include <semaphore>
-# endif
+# include <semaphore>
 #endif
 
 namespace std _GLIBCXX_VISIBILITY(default)
@@ -100,40 +98,6 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<typename _Callback>
       friend class stop_callback;
 
-    static void
-    _S_yield() noexcept
-    {
-#if defined __i386__ || defined __x86_64__
-      __builtin_ia32_pause();
-#elif defined _GLIBCXX_USE_SCHED_YIELD
-      __gthread_yield();
-#endif
-    }
-
-#ifndef __cpp_lib_semaphore
-    // TODO: replace this with a real implementation of std::binary_semaphore
-    struct binary_semaphore
-    {
-      explicit binary_semaphore(int __d) : _M_counter(__d > 0) { }
-
-      void release() { _M_counter.fetch_add(1, memory_order::release); }
-
-      void acquire()
-      {
-	int __old = 1;
-	while (!_M_counter.compare_exchange_weak(__old, 0,
-						 memory_order::acquire,
-						 memory_order::relaxed))
-	  {
-	    __old = 1;
-	    _S_yield();
-	  }
-      }
-
-      atomic<int> _M_counter;
-    };
-#endif
-
     struct _Stop_cb
     {
       using __cb_type = void(_Stop_cb*) noexcept;
@@ -389,7 +353,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       {
 	if (__curval & _S_locked_bit)
 	  {
-	    _S_yield();
+	    __detail::__thread_yield();
 	    __curval = _M_value.load(__failure);
 	    return false;
 	  }