20 #include <ripple/basics/Log.h>
21 #include <ripple/basics/ResolverAsio.h>
22 #include <ripple/beast/net/IPAddressConversion.h>
23 #include <ripple/beast/net/IPEndpoint.h>
24 #include <boost/asio.hpp>
39 template <
class Derived>
75 m_owner->asyncHandlersComplete();
95 (
static_cast<Derived*
>(
this))->asyncHandlersComplete();
128 template <
class StringSequence>
142 boost::asio::io_service& io_service,
221 assert(!names.
empty());
230 CompletionCounter(
this))));
251 boost::system::error_code
const& ec,
253 boost::asio::ip::tcp::resolver::iterator iter,
256 if (ec == boost::asio::error::operation_aborted)
265 while (iter != boost::asio::ip::tcp::resolver::iterator())
273 handler(name, addresses);
297 &std::isspace<std::string::value_type>,
298 std::placeholders::_1,
308 if (host_first >= port_last)
312 auto const find_port_separator = [](
char const c) ->
bool {
313 if (std::isspace(
static_cast<unsigned char>(c)))
323 std::find_if(host_first, port_last, find_port_separator);
345 m_work.front().names.pop_back();
347 if (
m_work.front().names.empty())
350 auto const [host, port] =
parseName(name);
362 boost::asio::ip::tcp::resolver::query query(host, port);
370 std::placeholders::_1,
372 std::placeholders::_2,
373 CompletionCounter(
this)));
382 assert(!names.
empty());
386 m_work.emplace_back(names, handler);
389 <<
"Queued new job with " << names.
size() <<
" tasks. "
390 <<
m_work.size() <<
" jobs outstanding.";
397 CompletionCounter(
this))));
408 return std::make_unique<ResolverAsioImpl>(io_service, journal);
std::atomic< int > m_pending
std::deque< Work > m_work
T reverse_copy(T... args)
void stop() override
Issue a synchronous stop request.
boost::asio::io_service & m_io_service
std::vector< std::string > names
T back_inserter(T... args)
bool m_asyncHandlersCompleted
CompletionCounter(Derived *owner)
static std::unique_ptr< ResolverAsio > New(boost::asio::io_service &, beast::Journal)
CompletionCounter & operator=(CompletionCounter const &)=delete
CompletionCounter(CompletionCounter const &other)
HostAndPort parseName(std::string const &str)
static IP::Endpoint from_asio(boost::asio::ip::address const &address)
std::pair< std::string, std::string > HostAndPort
Work(StringSequence const &names_, HandlerType const &handler_)
std::condition_variable m_cv
RAII container that maintains the count of pending I/O.
void do_finish(std::string name, boost::system::error_code const &ec, HandlerType handler, boost::asio::ip::tcp::resolver::iterator iter, CompletionCounter)
A generic endpoint for log messages.
void resolve(std::vector< std::string > const &names, HandlerType const &handler) override
std::atomic< bool > m_stopped
~ResolverAsioImpl() override
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
void stop_async() override
Issue an asynchronous stop request.
void start() override
Issue a synchronous start request.
void asyncHandlersComplete()
std::atomic< bool > m_stop_called
boost::asio::io_service::strand m_strand
ResolverAsioImpl(boost::asio::io_service &io_service, beast::Journal journal)
Mix-in to track when all pending I/O is complete.
void do_resolve(std::vector< std::string > const &names, HandlerType const &handler, CompletionCounter)
void do_work(CompletionCounter)
boost::asio::ip::tcp::resolver m_resolver
static std::optional< Endpoint > from_string_checked(std::string const &s)
Create an Endpoint from a string.
void do_stop(CompletionCounter)