Container System 0.1.0
High-performance C++20 type-safe container framework with SIMD-accelerated serialization
Loading...
Searching...
No Matches
kcenon::container::async::detail::executor_awaitable< T > Struct Template Reference

Awaitable that runs work using an executor or fallback thread. More...

#include <thread_pool_executor.h>

Collaboration diagram for kcenon::container::async::detail::executor_awaitable< T >:
Collaboration graph

Public Member Functions

 executor_awaitable (std::function< T()> work, executor_ptr executor)
 
 executor_awaitable (executor_awaitable &&) noexcept=default
 
executor_awaitableoperator= (executor_awaitable &&) noexcept=default
 
 executor_awaitable (const executor_awaitable &)=delete
 
executor_awaitableoperator= (const executor_awaitable &)=delete
 
bool await_ready () const noexcept
 
void await_suspend (std::coroutine_handle<> handle)
 
await_resume ()
 

Public Attributes

std::shared_ptr< executor_state< T > > state_
 
executor_ptr executor_
 

Static Private Member Functions

static void run_in_thread (std::shared_ptr< executor_state< T > > state, std::coroutine_handle<> handle)
 

Detailed Description

template<typename T>
struct kcenon::container::async::detail::executor_awaitable< T >

Awaitable that runs work using an executor or fallback thread.

When an executor is provided, submits work to the executor. Otherwise, falls back to std::thread-based execution.

Definition at line 91 of file thread_pool_executor.h.

Constructor & Destructor Documentation

◆ executor_awaitable() [1/3]

template<typename T >
kcenon::container::async::detail::executor_awaitable< T >::executor_awaitable ( std::function< T()> work,
executor_ptr executor )
inline

Definition at line 96 of file thread_pool_executor.h.

97 : state_(std::make_shared<executor_state<T>>(std::move(work)))
98 , executor_(std::move(executor))
99 {
100 }

◆ executor_awaitable() [2/3]

template<typename T >
kcenon::container::async::detail::executor_awaitable< T >::executor_awaitable ( executor_awaitable< T > && )
defaultnoexcept

◆ executor_awaitable() [3/3]

template<typename T >
kcenon::container::async::detail::executor_awaitable< T >::executor_awaitable ( const executor_awaitable< T > & )
delete

Member Function Documentation

◆ await_ready()

template<typename T >
bool kcenon::container::async::detail::executor_awaitable< T >::await_ready ( ) const
inlinenodiscardnoexcept

Definition at line 108 of file thread_pool_executor.h.

109 {
110 return false;
111 }

◆ await_resume()

template<typename T >
T kcenon::container::async::detail::executor_awaitable< T >::await_resume ( )
inline

Definition at line 163 of file thread_pool_executor.h.

164 {
165 while (!state_->ready_.load(std::memory_order_acquire)) {
166 // Spin until ready
167 }
168 if (state_->exception_) {
169 std::rethrow_exception(state_->exception_);
170 }
171 return std::move(*state_->result_);
172 }

References kcenon::container::async::detail::executor_awaitable< T >::state_.

◆ await_suspend()

template<typename T >
void kcenon::container::async::detail::executor_awaitable< T >::await_suspend ( std::coroutine_handle<> handle)
inline

Definition at line 113 of file thread_pool_executor.h.

114 {
115 auto state = state_;
116 state->continuation_ = handle;
117
118#ifdef KCENON_HAS_COMMON_SYSTEM
119 if (executor_ && executor_->is_running())
120 {
121 // Create a job that executes the work
122 class work_job : public kcenon::common::interfaces::IJob
123 {
124 public:
125 work_job(std::shared_ptr<executor_state<T>> s)
126 : state_(std::move(s)) {}
127
128 kcenon::common::VoidResult execute() override
129 {
130 try {
131 state_->result_.emplace(state_->work_());
132 } catch (...) {
133 state_->exception_ = std::current_exception();
134 }
135 state_->ready_.store(true, std::memory_order_release);
136 if (state_->continuation_) {
137 state_->continuation_.resume();
138 }
139 return kcenon::common::ok();
140 }
141
142 std::string get_name() const override {
143 return "async_container_work";
144 }
145
146 private:
147 std::shared_ptr<executor_state<T>> state_;
148 };
149
150 auto job = std::make_unique<work_job>(state);
151 auto result = executor_->execute(std::move(job));
152 if (!result.is_ok()) {
153 // Fallback to thread if executor fails
154 run_in_thread(state, handle);
155 }
156 return;
157 }
158#endif
159 // Fallback: run in a detached thread
160 run_in_thread(state, handle);
161 }
static void run_in_thread(std::shared_ptr< executor_state< T > > state, std::coroutine_handle<> handle)

References kcenon::container::async::detail::executor_awaitable< T >::executor_, kcenon::container::async::detail::executor_awaitable< T >::run_in_thread(), and kcenon::container::async::detail::executor_awaitable< T >::state_.

Here is the call graph for this function:

◆ operator=() [1/2]

template<typename T >
executor_awaitable & kcenon::container::async::detail::executor_awaitable< T >::operator= ( const executor_awaitable< T > & )
delete

◆ operator=() [2/2]

template<typename T >
executor_awaitable & kcenon::container::async::detail::executor_awaitable< T >::operator= ( executor_awaitable< T > && )
defaultnoexcept

◆ run_in_thread()

template<typename T >
static void kcenon::container::async::detail::executor_awaitable< T >::run_in_thread ( std::shared_ptr< executor_state< T > > state,
std::coroutine_handle<> handle )
inlinestaticprivate

Definition at line 175 of file thread_pool_executor.h.

178 {
179 std::thread([state, handle]() mutable {
180 try {
181 state->result_.emplace(state->work_());
182 } catch (...) {
183 state->exception_ = std::current_exception();
184 }
185 state->ready_.store(true, std::memory_order_release);
186 handle.resume();
187 }).detach();
188 }

Referenced by kcenon::container::async::detail::executor_awaitable< T >::await_suspend().

Here is the caller graph for this function:

Member Data Documentation

◆ executor_

◆ state_


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