xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
include
xrpl
peerfinder
detail
Checker.h
1
#pragma once
2
3
#include <xrpl/beast/net/IPAddressConversion.h>
4
#include <xrpl/beast/net/IPEndpoint.h>
5
6
#include <boost/asio/io_context.hpp>
7
#include <boost/asio/ip/tcp.hpp>
8
#include <boost/intrusive/list.hpp>
9
10
#include <
condition_variable
>
11
#include <
memory
>
12
#include <
mutex
>
13
14
namespace
xrpl::peer_finder
{
15
19
template
<
class
Protocol = boost::asio::ip::tcp>
20
class
Checker
21
{
22
private
:
23
using
ErrorCode
= boost::system::error_code;
24
25
struct
BasicAsyncOp
: boost::intrusive::list_base_hook<
26
boost::intrusive::link_mode<boost::intrusive::normal_link>>
27
{
28
virtual
~BasicAsyncOp
() =
default
;
29
30
virtual
void
31
stop
() = 0;
32
33
virtual
void
34
operator()
(
ErrorCode
const
& ec) = 0;
35
};
36
37
template
<
class
Handler>
38
struct
AsyncOp
:
BasicAsyncOp
39
{
40
using
SocketType
= Protocol::socket;
41
using
EndpointType
= Protocol::endpoint;
42
43
Checker
&
checker
;
44
SocketType
socket
;
45
Handler
handler
;
46
47
AsyncOp
(
Checker
& owner, boost::asio::io_context& ioContext, Handler&&
handler
);
48
49
~AsyncOp
()
override
50
{
51
checker
.remove(*
this
);
52
}
53
54
void
55
stop
()
override
;
56
57
void
58
operator()
(
ErrorCode
const
& ec)
override
;
// NOLINT(readability-identifier-naming)
59
};
60
61
//--------------------------------------------------------------------------
62
63
using
ListType
=
64
boost::intrusive::make_list<BasicAsyncOp, boost::intrusive::constant_time_size<true>>::type;
65
66
std::mutex
mutex_
;
67
std::condition_variable
cond_
;
68
boost::asio::io_context&
ioContext_
;
69
ListType
list_
;
70
bool
stop_
=
false
;
71
72
public
:
73
explicit
Checker
(boost::asio::io_context& ioContext);
74
82
~Checker
();
83
91
void
92
stop
();
93
97
void
98
wait
();
99
105
template
<
class
Handler>
106
void
107
asyncConnect
(
beast::ip::Endpoint
const
& endpoint, Handler&& handler);
108
109
private
:
110
void
111
remove
(BasicAsyncOp& op);
112
};
113
114
//------------------------------------------------------------------------------
115
116
template
<
class
Protocol>
117
template
<
class
Handler>
118
Checker<Protocol>::AsyncOp<Handler>::AsyncOp
(
119
Checker
& owner,
120
boost::asio::io_context& ioContext,
121
Handler&&
122
handler
)
// NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved) -- forwarded in init
123
:
checker
(owner),
socket
(ioContext),
handler
(
std
::forward<Handler>(
handler
))
124
{
125
}
126
127
template
<
class
Protocol>
128
template
<
class
Handler>
129
void
130
Checker<Protocol>::AsyncOp<Handler>::stop
()
131
{
132
ErrorCode
ec;
133
socket
.cancel(ec);
134
}
135
136
template
<
class
Protocol>
137
template
<
class
Handler>
138
void
139
Checker<Protocol>::AsyncOp<Handler>::operator()
(
ErrorCode
const
& ec)
140
{
141
handler
(ec);
142
}
143
144
//------------------------------------------------------------------------------
145
146
template
<
class
Protocol>
147
Checker<Protocol>::Checker
(boost::asio::io_context& ioContext) :
ioContext_
(ioContext)
148
{
149
}
150
151
template
<
class
Protocol>
152
Checker<Protocol>::~Checker
()
153
{
154
wait
();
155
}
156
157
template
<
class
Protocol>
158
void
159
Checker<Protocol>::stop
()
160
{
161
std::scoped_lock
const
lock(
mutex_
);
162
if
(!
stop_
)
163
{
164
stop_
=
true
;
165
for
(
auto
& c :
list_
)
166
c.stop();
167
}
168
}
169
170
template
<
class
Protocol>
171
void
172
Checker<Protocol>::wait
()
173
{
174
std::unique_lock<std::mutex>
lock(
mutex_
);
175
while
(!
list_
.empty())
176
cond_
.wait(lock);
177
}
178
179
template
<
class
Protocol>
180
template
<
class
Handler>
181
void
182
Checker<Protocol>::asyncConnect
(
beast::ip::Endpoint
const
& endpoint, Handler&& handler)
183
{
184
auto
const
op =
185
std::make_shared<AsyncOp<Handler>
>(*
this
,
ioContext_
,
std::forward<Handler>
(handler));
186
{
187
std::scoped_lock
const
lock(
mutex_
);
188
list_
.push_back(*op);
189
}
190
op->socket.async_connect(
191
beast::IPAddressConversion::toAsioEndpoint
(endpoint),
192
[op](
ErrorCode
const
& ec) { (*op)(ec); });
193
}
194
195
template
<
class
Protocol>
196
void
197
Checker<Protocol>::remove
(
BasicAsyncOp
& op)
198
{
199
std::scoped_lock
const
lock(
mutex_
);
200
list_
.erase(
list_
.iterator_to(op));
201
if
(
list_
.size() == 0)
202
cond_
.notify_all();
203
}
204
205
}
// namespace xrpl::peer_finder
beast::ip::Endpoint
A version-independent IP address and port combination.
Definition
IPEndpoint.h:24
xrpl::peer_finder::Checker::cond_
std::condition_variable cond_
Definition
Checker.h:67
xrpl::peer_finder::Checker::ErrorCode
boost::system::error_code ErrorCode
Definition
Checker.h:23
xrpl::peer_finder::Checker::stop_
bool stop_
Definition
Checker.h:70
xrpl::peer_finder::Checker::stop
void stop()
Stop the service.
Definition
Checker.h:159
xrpl::peer_finder::Checker::~Checker
~Checker()
Destroy the service.
Definition
Checker.h:152
xrpl::peer_finder::Checker::Checker
Checker(boost::asio::io_context &ioContext)
Definition
Checker.h:147
xrpl::peer_finder::Checker::mutex_
std::mutex mutex_
Definition
Checker.h:66
xrpl::peer_finder::Checker::asyncConnect
void asyncConnect(beast::ip::Endpoint const &endpoint, Handler &&handler)
Performs an async connection test on the specified endpoint.
Definition
Checker.h:182
xrpl::peer_finder::Checker::list_
ListType list_
Definition
Checker.h:69
xrpl::peer_finder::Checker::ListType
boost::intrusive::make_list< BasicAsyncOp, boost::intrusive::constant_time_size< true > >::type ListType
Definition
Checker.h:63
xrpl::peer_finder::Checker::remove
void remove(BasicAsyncOp &op)
Definition
Checker.h:197
xrpl::peer_finder::Checker::ioContext_
boost::asio::io_context & ioContext_
Definition
Checker.h:68
xrpl::peer_finder::Checker::wait
void wait()
Block until all pending I/O completes.
Definition
Checker.h:172
condition_variable
std::forward
T forward(T... args)
std::make_shared
T make_shared(T... args)
memory
mutex
std
STL namespace.
xrpl::peer_finder
Definition
include/xrpl/peerfinder/Config.h:12
std::scoped_lock
beast::IPAddressConversion::toAsioEndpoint
static boost::asio::ip::tcp::endpoint toAsioEndpoint(ip::Endpoint const &address)
Definition
IPAddressConversion.h:60
xrpl::peer_finder::Checker::AsyncOp::AsyncOp
AsyncOp(Checker &owner, boost::asio::io_context &ioContext, Handler &&handler)
Definition
Checker.h:118
xrpl::peer_finder::Checker::AsyncOp::socket
SocketType socket
Definition
Checker.h:44
xrpl::peer_finder::Checker::AsyncOp::stop
void stop() override
Definition
Checker.h:130
xrpl::peer_finder::Checker::AsyncOp::handler
Handler handler
Definition
Checker.h:45
xrpl::peer_finder::Checker::AsyncOp::operator()
void operator()(ErrorCode const &ec) override
Definition
Checker.h:139
xrpl::peer_finder::Checker::AsyncOp::EndpointType
Protocol::endpoint EndpointType
Definition
Checker.h:41
xrpl::peer_finder::Checker::AsyncOp::~AsyncOp
~AsyncOp() override
Definition
Checker.h:49
xrpl::peer_finder::Checker::AsyncOp::SocketType
Protocol::socket SocketType
Definition
Checker.h:40
xrpl::peer_finder::Checker::AsyncOp::checker
Checker & checker
Definition
Checker.h:43
xrpl::peer_finder::Checker::BasicAsyncOp
Definition
Checker.h:27
xrpl::peer_finder::Checker::BasicAsyncOp::stop
virtual void stop()=0
xrpl::peer_finder::Checker::BasicAsyncOp::~BasicAsyncOp
virtual ~BasicAsyncOp()=default
xrpl::peer_finder::Checker::BasicAsyncOp::operator()
virtual void operator()(ErrorCode const &ec)=0
std::unique_lock
Generated by
1.17.0