Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
AsyncEvent.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <atomic>
10#include <coroutine>
11#include <type_traits>
12#include <utility>
13
14namespace corium::async {
15
20template <typename T = void>
22public:
23 using ValueType = T;
24
25 constexpr AsyncEvent() = default;
26
28 template <typename U>
29 requires (std::is_convertible_v<U, T>)
30 void emit(U&& value) {
31 _value = std::forward<U>(value);
32 _ready.store(true, std::memory_order_release);
33 auto h = _waiter.exchange(nullptr, std::memory_order_acq_rel);
34 if (h && !h.done()) {
35 h.resume();
36 }
37 }
38
40 void reset() noexcept {
41 _ready.store(false, std::memory_order_release);
42 _waiter.store(nullptr, std::memory_order_release);
43 }
44
46 [[nodiscard]] bool isReady() const noexcept {
47 return _ready.load(std::memory_order_acquire);
48 }
49
50 struct Awaiter {
52
53 [[nodiscard]] bool await_ready() const noexcept {
54 return event.isReady();
55 }
56
57 bool await_suspend(std::coroutine_handle<> h) noexcept {
58 if (event.isReady()) {
59 return false;
60 }
61 event._waiter.store(h, std::memory_order_release);
62 return !event.isReady();
63 }
64
66 event._ready.store(false, std::memory_order_release);
67 return std::move(event._value);
68 }
69 };
70
72 [[nodiscard]] Awaiter wait() noexcept {
73 return Awaiter{*this};
74 }
75
77 [[nodiscard]] Awaiter operator co_await() noexcept {
78 return Awaiter{*this};
79 }
80
81private:
82 std::atomic<std::coroutine_handle<>> _waiter{nullptr};
83 T _value{};
84 std::atomic<bool> _ready{false};
85};
86
88template <>
89class AsyncEvent<void> {
90public:
91 using ValueType = void;
92
93 constexpr AsyncEvent() = default;
94
96 void emit() noexcept {
97 _ready.store(true, std::memory_order_release);
98 auto h = _waiter.exchange(nullptr, std::memory_order_acq_rel);
99 if (h && !h.done()) {
100 h.resume();
101 }
102 }
103
105 void reset() noexcept {
106 _ready.store(false, std::memory_order_release);
107 _waiter.store(nullptr, std::memory_order_release);
108 }
109
111 [[nodiscard]] bool isReady() const noexcept {
112 return _ready.load(std::memory_order_acquire);
113 }
114
115 struct Awaiter {
117
118 [[nodiscard]] bool await_ready() const noexcept {
119 return event.isReady();
120 }
121
122 bool await_suspend(std::coroutine_handle<> h) noexcept {
123 if (event.isReady()) {
124 return false;
125 }
126 event._waiter.store(h, std::memory_order_release);
127 return !event.isReady();
128 }
129
130 constexpr void await_resume() const noexcept {}
131 };
132
134 [[nodiscard]] Awaiter wait() noexcept {
135 return Awaiter{*this};
136 }
137
139 [[nodiscard]] Awaiter operator co_await() noexcept {
140 return Awaiter{*this};
141 }
142
143private:
144 std::atomic<std::coroutine_handle<>> _waiter{nullptr};
145 std::atomic<bool> _ready{false};
146};
147
148} // namespace corium::async
bool isReady() const noexcept
Check if event has been signaled.
Definition AsyncEvent.hpp:111
void reset() noexcept
Reset event to unsignaled state.
Definition AsyncEvent.hpp:105
Awaiter wait() noexcept
Awaiter factory for co_await syntax.
Definition AsyncEvent.hpp:134
void emit() noexcept
Signal the event and resume waiting coroutine.
Definition AsyncEvent.hpp:96
constexpr AsyncEvent()=default
void ValueType
Definition AsyncEvent.hpp:91
Lock-free single-waiter asynchronous event channel for C++20 coroutines. Enables event-driven corouti...
Definition AsyncEvent.hpp:21
Awaiter wait() noexcept
Awaiter factory for co_await syntax.
Definition AsyncEvent.hpp:72
bool isReady() const noexcept
Check if event has been signaled.
Definition AsyncEvent.hpp:46
T ValueType
Definition AsyncEvent.hpp:23
void reset() noexcept
Reset event to unsignaled state.
Definition AsyncEvent.hpp:40
void emit(U &&value)
Emit event value and resume waiting coroutine.
Definition AsyncEvent.hpp:30
constexpr AsyncEvent()=default
Definition AsyncEvent.hpp:14
Definition AsyncEvent.hpp:50
bool await_suspend(std::coroutine_handle<> h) noexcept
Definition AsyncEvent.hpp:57
bool await_ready() const noexcept
Definition AsyncEvent.hpp:53
T await_resume()
Definition AsyncEvent.hpp:65
AsyncEvent & event
Definition AsyncEvent.hpp:51
bool await_ready() const noexcept
Definition AsyncEvent.hpp:118
AsyncEvent< void > & event
Definition AsyncEvent.hpp:116
bool await_suspend(std::coroutine_handle<> h) noexcept
Definition AsyncEvent.hpp:122
constexpr void await_resume() const noexcept
Definition AsyncEvent.hpp:130