25 #ifndef EXE4CPP_ASIO_STRANDEXECUTOR_H 26 #define EXE4CPP_ASIO_STRANDEXECUTOR_H 28 #include "exe4cpp/IExecutor.h" 29 #include "exe4cpp/asio/AsioTimer.h" 45 public std::enable_shared_from_this<StrandExecutor>
50 StrandExecutor(
const std::shared_ptr<asio::io_service>& io_service) :
51 io_service{io_service},
55 static std::shared_ptr<StrandExecutor> create(
const std::shared_ptr<asio::io_service>& io_service)
57 return std::make_shared<StrandExecutor>(io_service);
60 std::shared_ptr<StrandExecutor> fork()
62 return create(this->io_service);
67 virtual Timer start(
const duration_t& duration,
const action_t& action)
override 72 virtual Timer start(
const steady_time_t& expiration,
const action_t& action)
override 74 const auto timer = AsioTimer::create(this->io_service);
76 timer->impl.expires_at(expiration);
79 auto callback = [timer, action,
self = shared_from_this()](
const std::error_code & ec)
87 timer->impl.async_wait(strand.wrap(callback));
92 virtual void post(
const action_t& action)
override 94 auto callback = [action,
self = shared_from_this()]()
99 strand.post(callback);
104 return std::chrono::steady_clock::now();
107 inline std::shared_ptr<asio::io_service> get_service()
112 template <
typename handler_t>
113 asio::detail::wrapped_handler<asio::strand, handler_t, asio::detail::is_continuation_if_running> wrap(
const handler_t& handler)
115 return strand.wrap(handler);
120 const std::shared_ptr<asio::io_service> io_service;
virtual void post(const action_t &action) override
exe4cpp header-only library namespace
virtual Timer start(const steady_time_t &expiration, const action_t &action) override
virtual steady_time_t get_time() override
virtual Timer start(const duration_t &duration, const action_t &action) override