Replace the _S_get_current and _S_do_try_acquire static member functions with non-static member functions _M_get_current and _M_do_try_acquire. This means they don't need the address of _M_counter passed in.
libstdc++-v3/ChangeLog: * include/bits/semaphore_base.h (_S_get_current): Replace with non-static _M_get_current. (_S_do_try_acquire): Replace with non-static _M_do_try_acquire. --- I'm not sure why these were static member functions in the first place, it doesn't seem to have any benefit. Tested x86_64-linux. libstdc++-v3/include/bits/semaphore_base.h | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/include/bits/semaphore_base.h b/libstdc++-v3/include/bits/semaphore_base.h index 526da4d82b6a..3f7a33ccd51a 100644 --- a/libstdc++-v3/include/bits/semaphore_base.h +++ b/libstdc++-v3/include/bits/semaphore_base.h @@ -64,20 +64,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __semaphore_base(const __semaphore_base&) = delete; __semaphore_base& operator=(const __semaphore_base&) = delete; - static _GLIBCXX_ALWAYS_INLINE __count_type - _S_get_current(__count_type* __counter) noexcept - { - return __atomic_impl::load(__counter, memory_order::acquire); - } + // Load the current counter value. + _GLIBCXX_ALWAYS_INLINE __count_type + _M_get_current() const noexcept + { return __atomic_impl::load(&_M_counter, memory_order::acquire); } - static _GLIBCXX_ALWAYS_INLINE bool - _S_do_try_acquire(__count_type* __counter, __count_type& __old) noexcept + // Try to acquire the semaphore (i.e. decrement the counter). + // Returns false if the current counter is zero, or if another thread + // decrements the value first. In the latter case, __cur is set to the + // new value. + _GLIBCXX_ALWAYS_INLINE bool + _M_do_try_acquire(__count_type& __cur) noexcept { - if (__old == 0) - return false; + if (__cur == 0) + return false; // Cannot decrement when it's already zero. - return __atomic_impl::compare_exchange_strong(__counter, - __old, __old - 1, + return __atomic_impl::compare_exchange_strong(&_M_counter, + __cur, __cur - 1, memory_order::acquire, memory_order::relaxed); } @@ -85,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void _M_acquire() noexcept { - auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); }; + auto const __vfn = [this]{ return _M_get_current(); }; auto __val = __vfn(); auto const __pred = [&__val](__count_type __cur) { if (__cur > 0) @@ -95,7 +98,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return false; }; - while (!_S_do_try_acquire(&_M_counter, __val)) + while (!_M_do_try_acquire(__val)) if (__val == 0) std::__atomic_wait_address(&_M_counter, __pred, __vfn, true); } @@ -103,7 +106,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_try_acquire() noexcept { - // The fastest implementation of this function is just _S_do_try_acquire + // The fastest implementation of this function is just _M_do_try_acquire // but that can fail under contention even when _M_count > 0. // Using _M_try_acquire_for(0ns) will retry a few times in a loop. return _M_try_acquire_for(__detail::__wait_clock_t::duration{}); @@ -113,7 +116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_try_acquire_until(const chrono::time_point<_Clock, _Duration>& __atime) noexcept { - auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); }; + auto const __vfn = [this]{ return _M_get_current(); }; auto __val = __vfn(); auto const __pred = [&__val](__count_type __cur) { if (__cur > 0) @@ -123,7 +126,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return false; }; - while (!_S_do_try_acquire(&this->_M_counter, __val)) + while (!_M_do_try_acquire(__val)) if (__val == 0) { if (!std::__atomic_wait_address_until(&_M_counter, __pred, @@ -137,7 +140,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_try_acquire_for(const chrono::duration<_Rep, _Period>& __rtime) noexcept { - auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); }; + auto const __vfn = [this]{ return _M_get_current(); }; auto __val = __vfn(); auto const __pred = [&__val](__count_type __cur) { if (__cur > 0) @@ -147,7 +150,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return false; }; - while (!_S_do_try_acquire(&this->_M_counter, __val)) + while (!_M_do_try_acquire(__val)) if (__val == 0) { if (!std::__atomic_wait_address_for(&_M_counter, __pred, -- 2.49.0