Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 09:04:21

0001 /* Copyright (c) 2018-2024 Marcelo Zimbres Silva (mzimbres@gmail.com)
0002  *
0003  * Distributed under the Boost Software License, Version 1.0. (See
0004  * accompanying file LICENSE.txt)
0005  */
0006 
0007 #ifndef BOOST_REDIS_RESOLVER_HPP
0008 #define BOOST_REDIS_RESOLVER_HPP
0009 
0010 #include <boost/redis/config.hpp>
0011 #include <boost/redis/error.hpp>
0012 #include <boost/asio/compose.hpp>
0013 #include <boost/asio/coroutine.hpp>
0014 #include <boost/asio/ip/tcp.hpp>
0015 #include <boost/asio/cancel_after.hpp>
0016 #include <string>
0017 #include <chrono>
0018 
0019 namespace boost::redis::detail
0020 {
0021 
0022 template <class Resolver>
0023 struct resolve_op {
0024    Resolver* resv_ = nullptr;
0025    asio::coroutine coro{};
0026 
0027    template <class Self>
0028    void operator()( Self& self
0029                   , system::error_code ec = {}
0030                   , asio::ip::tcp::resolver::results_type res = {})
0031    {
0032       BOOST_ASIO_CORO_REENTER (coro)
0033       {
0034          BOOST_ASIO_CORO_YIELD
0035          resv_->resv_.async_resolve(
0036             resv_->addr_.host,
0037             resv_->addr_.port,
0038             asio::cancel_after(resv_->timeout_, std::move(self)));
0039 
0040          resv_->results_ = res;
0041 
0042          if (ec == asio::error::operation_aborted) {
0043             self.complete(error::resolve_timeout);
0044          } else {
0045             self.complete(ec);
0046          }
0047       }
0048    }
0049 };
0050 
0051 template <class Executor>
0052 class resolver {
0053 public:
0054    resolver(Executor ex) : resv_{ex} {}
0055 
0056    template <class CompletionToken>
0057    auto async_resolve(CompletionToken&& token)
0058    {
0059       return asio::async_compose
0060          < CompletionToken
0061          , void(system::error_code)
0062          >(resolve_op<resolver>{this}, token, resv_);
0063    }
0064 
0065    void cancel()
0066       { resv_.cancel(); }
0067 
0068    auto const& results() const noexcept
0069       { return results_;}
0070 
0071    void set_config(config const& cfg)
0072    {
0073       addr_ = cfg.addr;
0074       timeout_ = cfg.resolve_timeout;
0075    }
0076 
0077 private:
0078    using resolver_type = asio::ip::basic_resolver<asio::ip::tcp, Executor>;
0079    template <class> friend struct resolve_op;
0080 
0081    resolver_type resv_;
0082    address addr_;
0083    std::chrono::steady_clock::duration timeout_;
0084    asio::ip::tcp::resolver::results_type results_;
0085 };
0086 
0087 } // boost::redis::detail
0088 
0089 #endif // BOOST_REDIS_RESOLVER_HPP