3#include <xrpl/beast/utility/instrumentation.h>
5#include <boost/asio/basic_waitable_timer.hpp>
6#include <boost/asio/io_context.hpp>
7#include <boost/asio/post.hpp>
28 boost::asio::io_context&
ios_;
29 boost::asio::basic_waitable_timer<std::chrono::steady_clock>
timer_;
46 boost::asio::io_context&
52 [[nodiscard]] boost::asio::io_context
const&
82 template <
class Handler>
97 template <
class Handler>
119 cond_.wait(lock, [
this] {
return this->count_ == 0; });
137 template <
class Handler>
154 "beast::IOLatencyProbe::SampleOp::SampleOp : non-null "
160 :
handler(std::move(from.handler))
167 "beast::IOLatencyProbe::SampleOp::SampleOp(SampleOp&&) : "
168 "non-null probe input");
169 from.probe =
nullptr;
187 if (
probe ==
nullptr)
189 typename Clock::time_point
const now(Clock::now());
190 typename Clock::duration
const elapsed(now -
start);
205 typename Clock::time_point
const when(now +
probe->period_ - (2 * elapsed));
216 probe->timer_.expires_after(when - now);
225 if (
probe ==
nullptr)
227 typename Clock::time_point
const now(Clock::now());
IOLatencyProbe(duration const &period, boost::asio::io_context &ios)
boost::asio::io_context const & getIoContext() const
std::recursive_mutex mutex_
boost::asio::io_context & getIoContext()
Return the io_context associated with the latency probe.
void sampleOne(Handler &&handler)
Measure one sample of i/o latency.
void cancel(std::unique_lock< decltype(mutex_)> &lock, bool wait)
std::condition_variable_any cond_
void cancel()
Cancel all pending i/o.
void sample(Handler &&handler)
Initiate continuous i/o latency sampling.
boost::asio::basic_waitable_timer< std::chrono::steady_clock > timer_
boost::asio::io_context & ios_
Clock::time_point time_point
void operator()(boost::system::error_code const &ec)
SampleOp operator=(SampleOp const &)=delete
SampleOp(SampleOp const &)=delete
SampleOp & operator=(SampleOp &&)=delete
SampleOp(SampleOp &&from) noexcept
SampleOp(Handler const &handler, time_point const &start, bool repeat, IOLatencyProbe *probe)