memset(error_buf, 0, sizeof(error_buf));
}
- template <typename ExecutionContext, typename CompletionToken>
- auto async_wait(ExecutionContext& ctx, CompletionToken&& token) {
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto& handler = init.completion_handler;
- {
- std::unique_lock l{lock};
- completion = Completion::create(ctx.get_executor(), std::move(handler));
- }
- return init.result.get();
+ template <typename Executor, typename CompletionToken>
+ auto async_wait(const Executor& ex, CompletionToken&& token) {
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [this] (auto handler, auto ex) {
+ std::unique_lock l{lock};
+ completion = Completion::create(ex, std::move(handler));
+ }, token, ex);
}
int wait(optional_yield y) {
return ret;
}
if (y) {
- auto& context = y.get_io_context();
auto& yield = y.get_yield_context();
boost::system::error_code ec;
- async_wait(context, yield[ec]);
+ async_wait(yield.get_executor(), yield[ec]);
return -ec.value();
}
// work on asio threads should be asynchronous, so warn when they block