Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
WithTimeout.hpp
1#pragma once
2
3#include <boost/asio/associated_executor.hpp>
4#include <boost/asio/bind_cancellation_slot.hpp>
5#include <boost/asio/cancellation_signal.hpp>
6#include <boost/asio/cancellation_type.hpp>
7#include <boost/asio/spawn.hpp>
8#include <boost/asio/steady_timer.hpp>
9#include <boost/system/detail/error_code.hpp>
10#include <boost/system/errc.hpp>
11
12#include <chrono>
13#include <ctime>
14#include <memory>
15
16namespace util {
17
28template <typename Operation>
29boost::system::error_code
31 Operation&& operation,
32 boost::asio::yield_context yield,
33 std::chrono::steady_clock::duration timeout
34)
35{
36 boost::system::error_code error;
37 auto operationCompleted = std::make_shared<bool>(false);
38 boost::asio::cancellation_signal cancellationSignal;
39 auto cyield = boost::asio::bind_cancellation_slot(cancellationSignal.slot(), yield[error]);
40
41 boost::asio::steady_timer timer{boost::asio::get_associated_executor(cyield), timeout};
42 timer.async_wait([&cancellationSignal,
43 operationCompleted](boost::system::error_code errorCode) {
44 if (!errorCode and !*operationCompleted)
45 cancellationSignal.emit(boost::asio::cancellation_type::terminal);
46 });
47 operation(cyield);
48 *operationCompleted = true;
49
50 // Map error code to timeout
51 if (error == boost::system::errc::operation_canceled) {
52 return boost::system::errc::make_error_code(boost::system::errc::timed_out);
53 }
54 return error;
55}
56
57} // namespace util
This namespace contains various utilities.
Definition AccountUtils.hpp:11
boost::system::error_code withTimeout(Operation &&operation, boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout)
Perform a coroutine operation with a timeout.
Definition WithTimeout.hpp:30