65 auto* w =
m_waiter.exchange(
nullptr, std::memory_order_acq_rel);
99 std::atomic<Kriya::BroadcastAwaiter<T>*>
m_waiter {
nullptr };
124 m_waiter.store(awaiter, std::memory_order_release);
132 std::memory_order_acq_rel, std::memory_order_relaxed);
Awaiter for suspending a coroutine until a BroadcastSource<T> fires.
void signal(const T &value)
Deliver a value to the waiting coroutine, or store it as pending.
BroadcastSource(BroadcastSource &&)=delete
Kriya::BroadcastAwaiter< T > next()
Create an awaiter for the next signal.
BroadcastSource & operator=(const BroadcastSource &)=delete
bool has_pending() const override
Returns true if a value arrived before any awaiter registered.
void register_waiter(Kriya::BroadcastAwaiter< T > *awaiter)
~BroadcastSource() override=default
BroadcastSource & operator=(BroadcastSource &&)=delete
void unregister_waiter(Kriya::BroadcastAwaiter< T > *awaiter)
std::atomic< Kriya::BroadcastAwaiter< T > * > m_waiter
void clear() override
Discard any stored pending value.
BroadcastSource()=default
std::atomic< bool > m_pending_flag
std::optional< T > pop_pending()
Consume and return the pending value if one is available.
T m_pending_value
Pending value written by signal() when no waiter is registered.
BroadcastSource(const BroadcastSource &)=delete
Awaitable single-value broadcast channel for cross-thread signal delivery.
Abstract base for all awaitable signal sources.