22 : m_count(initialCount)
32 ptrdiff_t current = m_count.load(std::memory_order_relaxed);
34 if (m_count.compare_exchange_weak(current, current - 1,
35 std::memory_order_acquire,
36 std::memory_order_relaxed)) {
45 void release(ptrdiff_t update = 1) noexcept {
46 m_count.fetch_add(update, std::memory_order_release);
47 auto h = m_waiter.exchange(
nullptr, std::memory_order_acq_rel);
54 [[nodiscard]] ptrdiff_t
available() const noexcept {
55 return m_count.load(std::memory_order_relaxed);
70 sem.m_waiter.store(h, std::memory_order_release);
83 std::atomic<ptrdiff_t> m_count{1};
84 std::atomic<std::coroutine_handle<>> m_waiter{
nullptr};
Asynchronous counting semaphore for cooperative coroutine concurrency throttling.
Definition Semaphore.hpp:17
AsyncSemaphore & operator=(const AsyncSemaphore &)=delete
void release(ptrdiff_t update=1) noexcept
Release one or more permits and resume waiting coroutines.
Definition Semaphore.hpp:45
bool tryAcquire() noexcept
Non-blocking attempt to acquire a permit.
Definition Semaphore.hpp:31
AcquireAwaiter acquire() noexcept
Acquire a permit asynchronously (suspends coroutine until permit is released).
Definition Semaphore.hpp:78
constexpr AsyncSemaphore(ptrdiff_t initialCount=1) noexcept
Construct semaphore with initial available count.
Definition Semaphore.hpp:21
~AsyncSemaphore()=default
ptrdiff_t available() const noexcept
Available permit count.
Definition Semaphore.hpp:54
AsyncSemaphore(const AsyncSemaphore &)=delete
Definition AsyncEvent.hpp:14
Awaiter for acquiring a permit asynchronously.
Definition Semaphore.hpp:59
bool await_ready() const noexcept
Definition Semaphore.hpp:62
constexpr void await_resume() const noexcept
Definition Semaphore.hpp:74
AsyncSemaphore & sem
Definition Semaphore.hpp:60
bool await_suspend(std::coroutine_handle<> h) noexcept
Definition Semaphore.hpp:66