diff --git a/include/boost/redis/detail/resolver.hpp b/include/boost/redis/detail/resolver.hpp index 583f7c3a..3af89fdf 100644 --- a/include/boost/redis/detail/resolver.hpp +++ b/include/boost/redis/detail/resolver.hpp @@ -12,9 +12,8 @@ #include #include #include -#include #include -#include +#include #include #include @@ -28,52 +27,21 @@ struct resolve_op { template void operator()( Self& self - , std::array order = {} - , system::error_code ec1 = {} - , asio::ip::tcp::resolver::results_type res = {} - , system::error_code ec2 = {}) + , system::error_code ec = {} + , asio::ip::tcp::resolver::results_type res = {}) { BOOST_ASIO_CORO_REENTER (coro) { - resv_->timer_.expires_after(resv_->timeout_); - BOOST_ASIO_CORO_YIELD - asio::experimental::make_parallel_group( - [this](auto token) - { - return resv_->resv_.async_resolve(resv_->addr_.host, resv_->addr_.port, token); - }, - [this](auto token) { return resv_->timer_.async_wait(token);} - ).async_wait( - asio::experimental::wait_for_one(), - std::move(self)); - - if (is_cancelled(self)) { - self.complete(asio::error::operation_aborted); - return; - } - - switch (order[0]) { - case 0: { - // Resolver completed first. - resv_->results_ = res; - self.complete(ec1); - } break; - - case 1: { - if (ec2) { - // Timer completed first with error, perhaps a - // cancellation going on. - self.complete(ec2); - } else { - // Timer completed first without an error, this is a - // resolve timeout. - self.complete(error::resolve_timeout); - } - } break; - - default: BOOST_ASSERT(false); - } + resv_->resv_.async_resolve( + resv_->addr_.host, + resv_->addr_.port, + asio::cancel_after(resv_->timeout_, std::move(self))); + + resv_->results_ = res; + + // TODO: map operation_canceled into error::resolve_timeout + self.complete(ec); } } }; @@ -81,13 +49,7 @@ struct resolve_op { template class resolver { public: - using timer_type = - asio::basic_waitable_timer< - std::chrono::steady_clock, - asio::wait_traits, - Executor>; - - resolver(Executor ex) : resv_{ex} , timer_{ex} {} + resolver(Executor ex) : resv_{ex} {} template auto async_resolve(CompletionToken&& token) @@ -104,7 +66,6 @@ class resolver { case operation::resolve: case operation::all: resv_.cancel(); - timer_.cancel(); break; default: /* ignore */; } @@ -126,7 +87,6 @@ class resolver { template friend struct resolve_op; resolver_type resv_; - timer_type timer_; address addr_; std::chrono::steady_clock::duration timeout_; asio::ip::tcp::resolver::results_type results_;