Line data Source code
1 : //
2 : // Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #include <boost/corosio/resolver.hpp>
11 : #include <boost/corosio/detail/platform.hpp>
12 :
13 : #if BOOST_COROSIO_HAS_IOCP
14 : #include "src/detail/iocp/resolver_service.hpp"
15 : #elif BOOST_COROSIO_POSIX
16 : #include "src/detail/posix/resolver_service.hpp"
17 : #endif
18 :
19 : #include <stdexcept>
20 :
21 : /*
22 : Resolver Frontend
23 : =================
24 :
25 : This file implements the public resolver class, which delegates to
26 : platform-specific services:
27 : - Windows: win_resolver_service (uses GetAddrInfoExW)
28 : - POSIX: posix_resolver_service (uses getaddrinfo + worker threads)
29 :
30 : The resolver constructor uses find_service() to locate the resolver
31 : service, which must have been previously created by the scheduler
32 : during io_context construction. If not found, construction fails.
33 :
34 : This separation allows the public API to be platform-agnostic while
35 : the implementation details are hidden in the detail namespace.
36 : */
37 :
38 : namespace boost::corosio {
39 : namespace {
40 :
41 : #if BOOST_COROSIO_HAS_IOCP
42 : using resolver_service = detail::win_resolver_service;
43 : #elif BOOST_COROSIO_POSIX
44 : using resolver_service = detail::posix_resolver_service;
45 : #endif
46 :
47 : } // namespace
48 :
49 30 : resolver::
50 30 : ~resolver()
51 : {
52 30 : if (impl_)
53 28 : impl_->release();
54 30 : }
55 :
56 29 : resolver::
57 : resolver(
58 29 : capy::execution_context& ctx)
59 29 : : io_object(ctx)
60 : {
61 29 : auto* svc = ctx_->find_service<resolver_service>();
62 29 : if (!svc)
63 : {
64 : // Resolver service not yet created - this happens if io_context
65 : // hasn't been constructed yet, or if the scheduler didn't
66 : // initialize the resolver service
67 0 : throw std::runtime_error("resolver_service not found");
68 : }
69 29 : auto& impl = svc->create_impl();
70 29 : impl_ = &impl;
71 29 : }
72 :
73 : void
74 5 : resolver::
75 : cancel()
76 : {
77 5 : if (impl_)
78 5 : get().cancel();
79 5 : }
80 :
81 : } // namespace boost::corosio
|