MySQL 9.2.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
destination_acceptor.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2017, 2024, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef MYSQL_HARNESS_DESTINATION_ACCEPTOR_INCLUDED
27#define MYSQL_HARNESS_DESTINATION_ACCEPTOR_INCLUDED
28
29#include "harness_export.h"
30
31#include <variant>
32
37
38namespace mysql_harness {
39
40class HARNESS_EXPORT DestinationAcceptor {
41 public:
44
46 : acceptor_(TcpType(io_ctx)) {}
47 explicit DestinationAcceptor(TcpType sock) : acceptor_(std::move(sock)) {}
48 explicit DestinationAcceptor(LocalType sock) : acceptor_(std::move(sock)) {}
49
50 bool is_tcp() const { return std::holds_alternative<TcpType>(acceptor_); }
51 bool is_local() const { return !is_tcp(); }
52
53 TcpType &as_tcp() { return std::get<TcpType>(acceptor_); }
54 const TcpType &as_tcp() const { return std::get<TcpType>(acceptor_); }
55
56 LocalType &as_local() { return std::get<LocalType>(acceptor_); }
57 const LocalType &as_local() const { return std::get<LocalType>(acceptor_); }
58
61
64 if (ep.is_local()) {
65 return as_local().bind(ep.as_local());
66 }
67
68 return as_tcp().bind(ep.as_tcp());
69 }
70
72 if (is_local()) {
73 return as_local().listen(backlog);
74 }
75
76 return as_tcp().listen(backlog);
77 }
78
80 if (is_local()) {
81 return as_local().native_non_blocking(val);
82 }
83
84 return as_tcp().native_non_blocking(val);
85 }
86
88 if (is_local()) {
89 return as_local().native_handle();
90 }
91
92 return as_tcp().native_handle();
93 }
94
95 template <typename SettableSocketOption>
97 const SettableSocketOption &option) {
98 if (is_local()) {
99 return as_local().set_option(option);
100 }
101
102 return as_tcp().set_option(option);
103 }
104
106 if (is_local()) {
107 return as_local().get_executor();
108 }
109
110 return as_tcp().get_executor();
111 }
112
113 net::io_context &io_context() { return get_executor().context(); }
114
116 if (is_local()) {
117 return as_local().cancel();
118 }
119
120 return as_tcp().cancel();
121 }
122
124 if (is_local()) {
125 return as_local().close();
126 }
127
128 return as_tcp().close();
129 }
130
131 template <class CompletionToken>
132 auto async_wait(net::socket_base::wait_type wt, CompletionToken &&token) {
133 if (is_local()) {
134 return as_local().async_wait(wt, std::forward<CompletionToken>(token));
135 }
136
137 return as_tcp().async_wait(wt, std::forward<CompletionToken>(token));
138 }
139
140 template <class CompletionToken>
141 auto async_accept(CompletionToken &&token) {
142 if (is_local()) {
143 return as_local().async_accept(std::forward<CompletionToken>(token));
144 }
145
146 return as_tcp().async_accept(std::forward<CompletionToken>(token));
147 }
148
149 template <class CompletionToken>
151 CompletionToken &&token) {
152 if (is_local()) {
153 if (!ep.is_local()) {
156 }
157 return as_local().async_accept(ep.as_local(),
158 std::forward<CompletionToken>(token));
159 }
160
161 if (!ep.is_tcp()) {
164 }
165
166 return as_tcp().async_accept(ep.as_tcp(),
167 std::forward<CompletionToken>(token));
168 }
169
170 template <class CompletionToken>
171 void async_accept(net::io_context &io_ctx, CompletionToken &&token) {
172 if (is_local()) {
173 return as_local().async_accept(io_ctx,
174 std::forward<CompletionToken>(token));
175 }
176
177 return as_tcp().async_accept(io_ctx, std::forward<CompletionToken>(token));
178 }
179
180 private:
181 std::variant<TcpType, LocalType> acceptor_;
182};
183
184} // namespace mysql_harness
185
186#endif
net::basic_socket_acceptor< stream_protocol > acceptor
Definition: local.h:305
Definition: destination_acceptor.h:40
stdx::expected< void, std::error_code > bind(const mysql_harness::DestinationEndpoint &ep)
Definition: destination_acceptor.h:62
const LocalType & as_local() const
Definition: destination_acceptor.h:57
stdx::expected< void, std::error_code > cancel()
Definition: destination_acceptor.h:115
net::io_context & io_context()
Definition: destination_acceptor.h:113
LocalType & as_local()
Definition: destination_acceptor.h:56
DestinationAcceptor(net::io_context &io_ctx)
Definition: destination_acceptor.h:45
bool is_local() const
Definition: destination_acceptor.h:51
auto async_accept(CompletionToken &&token)
Definition: destination_acceptor.h:141
bool is_tcp() const
Definition: destination_acceptor.h:50
stdx::expected< void, std::error_code > set_option(const SettableSocketOption &option)
Definition: destination_acceptor.h:96
stdx::expected< void, std::error_code > listen(int backlog)
Definition: destination_acceptor.h:71
TcpType & as_tcp()
Definition: destination_acceptor.h:53
net::io_context::executor_type get_executor()
Definition: destination_acceptor.h:105
const TcpType & as_tcp() const
Definition: destination_acceptor.h:54
stdx::expected< void, std::error_code > native_non_blocking(bool val)
Definition: destination_acceptor.h:79
std::variant< TcpType, LocalType > acceptor_
Definition: destination_acceptor.h:181
void async_accept(net::io_context &io_ctx, CompletionToken &&token)
Definition: destination_acceptor.h:171
net::impl::socket::native_handle_type native_handle() const
Definition: destination_acceptor.h:87
DestinationAcceptor(LocalType sock)
Definition: destination_acceptor.h:48
auto async_wait(net::socket_base::wait_type wt, CompletionToken &&token)
Definition: destination_acceptor.h:132
auto async_accept(mysql_harness::DestinationEndpoint &ep, CompletionToken &&token)
Definition: destination_acceptor.h:150
stdx::expected< void, std::error_code > close()
Definition: destination_acceptor.h:123
DestinationAcceptor(TcpType sock)
Definition: destination_acceptor.h:47
Definition: destination_endpoint.h:38
TcpType & as_tcp()
Definition: destination_endpoint.h:50
bool is_local() const
Definition: destination_endpoint.h:48
LocalType & as_local()
Definition: destination_endpoint.h:53
bool is_tcp() const
Definition: destination_endpoint.h:47
Definition: socket.h:1293
Definition: io_context.h:991
Definition: io_context.h:61
Definition: internet.h:678
basic_socket_acceptor< tcp > acceptor
Definition: internet.h:1160
Definition: expected.h:286
static MYSQL * sock
Definition: mysqlcheck.cc:57
Definition: common.h:44
wait_type
Definition: socket_constants.h:86
int native_handle_type
Definition: socket_constants.h:51
Definition: gcs_xcom_synode.h:64
stdx::expected< int, std::error_code > open(const char *fname, int flags, mode_t mode) noexcept
Definition: file_handle.cc:79