Index: libcxx/include/semaphore =================================================================== --- libcxx/include/semaphore +++ libcxx/include/semaphore @@ -108,17 +108,22 @@ _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY bool try_acquire_for(chrono::duration const& __rel_time) { - auto const __test_fn = [=]() -> bool { - auto __old = __a.load(memory_order_acquire); - while(1) { - if (__old == 0) - return false; - if(__a.compare_exchange_strong(__old, __old - 1, memory_order_acquire, memory_order_relaxed)) - return true; - } - }; + if (__rel_time == chrono::duration::zero()) + return try_acquire(); + auto const __test_fn = [=]() -> bool { return try_acquire(); }; return __libcpp_thread_poll_with_backoff(__test_fn, __libcpp_timed_backoff_policy(), __rel_time); } + _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY + bool try_acquire() + { + auto __old = __a.load(memory_order_acquire); + while(1) { + if (__old == 0) + return false; + if(__a.compare_exchange_strong(__old, __old - 1, memory_order_acquire, memory_order_relaxed)) + return true; + } + } }; #ifndef _LIBCPP_NO_NATIVE_SEMAPHORES @@ -161,6 +166,11 @@ { return __libcpp_semaphore_wait_timed(&__semaphore, __rel_time); } + _LIBCPP_INLINE_VISIBILITY + bool try_acquire() + { + return try_acquire_for(chrono::nanoseconds::zero()); + } }; template @@ -215,7 +225,7 @@ _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY bool try_acquire() { - return try_acquire_for(chrono::nanoseconds::zero()); + return __semaphore.try_acquire(); } template _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY Index: libcxx/test/std/thread/thread.semaphore/try_acquire.pass.cpp =================================================================== --- libcxx/test/std/thread/thread.semaphore/try_acquire.pass.cpp +++ libcxx/test/std/thread/thread.semaphore/try_acquire.pass.cpp @@ -34,14 +34,17 @@ std::counting_semaphore<> s(1); assert(s.try_acquire()); + assert(!s.try_acquire()); s.release(); assert(s.try_acquire()); + assert(!s.try_acquire()); s.release(2); std::thread t = support::make_test_thread([&](){ assert(s.try_acquire()); }); t.join(); assert(s.try_acquire()); + assert(!s.try_acquire()); return 0; }