MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
MayaFlux::Vruta::BroadcastSource< T > Class Template Reference

Awaitable single-value broadcast channel for cross-thread signal delivery. More...

#include <BroadcastSource.hpp>

+ Inheritance diagram for MayaFlux::Vruta::BroadcastSource< T >:
+ Collaboration diagram for MayaFlux::Vruta::BroadcastSource< T >:

Public Member Functions

 BroadcastSource ()=default
 
 BroadcastSource (BroadcastSource &&)=delete
 
 BroadcastSource (const BroadcastSource &)=delete
 
void clear () override
 Discard any stored pending value.
 
bool has_pending () const override
 Returns true if a value arrived before any awaiter registered.
 
Kriya::BroadcastAwaiter< T > next ()
 Create an awaiter for the next signal.
 
BroadcastSourceoperator= (BroadcastSource &&)=delete
 
BroadcastSourceoperator= (const BroadcastSource &)=delete
 
void signal (const T &value)
 Deliver a value to the waiting coroutine, or store it as pending.
 
 ~BroadcastSource () override=default
 
- Public Member Functions inherited from MayaFlux::Vruta::EventSource
 EventSource ()=default
 
 EventSource (const EventSource &)=delete
 
 EventSource (EventSource &&) noexcept=default
 
EventSourceoperator= (const EventSource &)=delete
 
EventSourceoperator= (EventSource &&) noexcept=default
 
virtual ~EventSource ()=default
 

Private Member Functions

std::optional< T > pop_pending ()
 Consume and return the pending value if one is available.
 
void register_waiter (Kriya::BroadcastAwaiter< T > *awaiter)
 
void unregister_waiter (Kriya::BroadcastAwaiter< T > *awaiter)
 

Private Attributes

std::atomic< bool > m_pending_flag { false }
 
m_pending_value {}
 Pending value written by signal() when no waiter is registered.
 
std::atomic< Kriya::BroadcastAwaiter< T > * > m_waiter { nullptr }
 

Friends

class Kriya::BroadcastAwaiter< T >
 

Additional Inherited Members

- Protected Member Functions inherited from MayaFlux::Vruta::EventSource
void dispatch (const void *event)
 Iterates the waiter list, passing the type-erased signal to each.
 
void register_waiter (Kriya::EventAwaiter *awaiter)
 
void unregister_waiter (Kriya::EventAwaiter *awaiter)
 

Detailed Description

template<typename T>
class MayaFlux::Vruta::BroadcastSource< T >

Awaitable single-value broadcast channel for cross-thread signal delivery.

Bridges a callback-based producer (e.g. audio output observer) to a coroutine consumer via co_await. Each signal() call delivers to the suspended awaiter, or stores the value for the next await_ready() poll if no awaiter is registered.

Thread safety contract:

Race window between await_ready() returning false and await_suspend() completing registration is closed by signal() itself: it uses a generation counter so a missed signal leaves the pending slot non-null, which await_suspend() checks after registration via a second pop_pending() call. The self-resume in await_suspend is intentionally absent; instead the CAS leaves the awaiter registered and the value in m_result, and returns to the coroutine machinery which will call await_resume() when the handle is resumed by the scheduler or by a subsequent signal() deliver() call.

One coroutine per BroadcastSource instance. For fan-out, use one BroadcastSource per consumer.

Template Parameters
TPayload type. Must be copyable.
See also
BroadcastAwaiter

Definition at line 42 of file BroadcastSource.hpp.


The documentation for this class was generated from the following file: