|
MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
|
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. | |
| BroadcastSource & | operator= (BroadcastSource &&)=delete |
| BroadcastSource & | operator= (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 | |
| EventSource & | operator= (const EventSource &)=delete |
| EventSource & | operator= (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 } |
| T | 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) |
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.
| T | Payload type. Must be copyable. |
Definition at line 42 of file BroadcastSource.hpp.