diff --git a/repertory/librepertory/include/comm/packet/common.hpp b/repertory/librepertory/include/comm/packet/common.hpp index b81b0b19..6bcd3bb2 100644 --- a/repertory/librepertory/include/comm/packet/common.hpp +++ b/repertory/librepertory/include/comm/packet/common.hpp @@ -65,11 +65,10 @@ void read_exact_with_deadline(boost::asio::io_context &ctx, std::chrono::milliseconds deadline); template -auto run_with_deadline(boost::asio::io_context &ctx, +void run_with_deadline(boost::asio::io_context &ctx, boost::asio::ip::tcp::socket &sock, op_t &&operation, std::chrono::milliseconds deadline, - std::string event_name, std::string function_name) - -> void; + std::string event_name, std::string function_name); void write_all_with_deadline(boost::asio::io_context &ctx, boost::asio::ip::tcp::socket &sock, @@ -77,11 +76,10 @@ void write_all_with_deadline(boost::asio::io_context &ctx, std::chrono::milliseconds deadline); template -auto run_with_deadline(boost::asio::io_context &ctx, +void run_with_deadline(boost::asio::io_context &ctx, boost::asio::ip::tcp::socket &sock, op_t &&operation, std::chrono::milliseconds deadline, - std::string event_name, std::string function_name) - -> void { + std::string event_name, std::string function_name) { deadline = std::max(deadline, std::chrono::milliseconds{250}); struct request_state final { @@ -106,8 +104,6 @@ auto run_with_deadline(boost::asio::io_context &ctx, state_ptr->timer.async_wait([state_ptr](auto &&err) { if (not err and not state_ptr->done) { state_ptr->timed_out = true; - boost::system::error_code err2; - [[maybe_unused]] auto res = state_ptr->sock.cancel(err2); } }); @@ -121,13 +117,16 @@ auto run_with_deadline(boost::asio::io_context &ctx, ctx.run_one(); } - state_ptr->timer.cancel(); - // while (ctx.poll_one() > 0) { - // } + auto timed_out = state_ptr->timed_out.load(); + if (timed_out) { + boost::system::error_code err; + [[maybe_unused]] auto res = state_ptr->sock.cancel(err); + } + state_ptr->timer.cancel(); state_ptr->work_guard.reset(); - if (state_ptr->timed_out) { + if (timed_out) { repertory::event_system::instance().raise( event_name, function_name); throw std::runtime_error(fmt::format("{} timed-out", event_name));