47 #ifndef _MIRA_SYNCTIMEDREAD_H_ 48 #define _MIRA_SYNCTIMEDREAD_H_ 51 #include <boost/asio/deadline_timer.hpp> 52 #include <boost/optional.hpp> 53 #if BOOST_VERSION >= 106600 54 # include <boost/asio/io_context.hpp> 55 # include <boost/asio/system_timer.hpp> 63 namespace boost {
namespace asio {
71 inline void setTimerResult(optional<system::error_code>* codeStorage,
72 system::error_code code)
75 if (code == error::operation_aborted)
78 codeStorage->reset(code);
81 inline void setResult(optional<system::error_code>* codeStorage,
82 std::size_t* bytesReceivedStorage,
83 system::error_code code, std::size_t bytesReceived)
86 if (code == error::operation_aborted)
89 codeStorage->reset(code);
90 *bytesReceivedStorage = bytesReceived;
107 template<
typename SyncReadStream,
typename MutableBufferSequence>
108 std::size_t
read_some(SyncReadStream& s,
const MutableBufferSequence& buffers,
111 system::error_code ec;
112 std::size_t bytesRead =
read_some(s, buffers, timeout, ec);
113 detail::throw_error(ec);
123 template<
typename SyncReadStream,
typename MutableBufferSequence>
124 std::size_t
read_some(SyncReadStream& s,
const MutableBufferSequence& buffers,
127 ec = boost::system::error_code();
128 optional<system::error_code> timerResult;
129 optional<system::error_code> readResult;
130 std::size_t bytesRead = 0;
132 #if BOOST_VERSION >= 106600 133 boost::asio::io_context& s_io_service =
static_cast<boost::asio::io_context&
>(s.get_executor().context());
134 system_timer timer(s_io_service);
135 timer.expires_after(std::chrono::microseconds(timeout.total_microseconds()));
137 auto& s_io_service = s.get_io_service();
138 deadline_timer timer(s_io_service);
139 timer.expires_from_now(timeout);
142 #if BOOST_VERSION >= 107400 143 using namespace mira::placeholders;
145 timer.async_wait(bind(&Private::setTimerResult, &timerResult, _1));
147 s.async_read_some(buffers, bind(&Private::setResult,
148 &readResult, &bytesRead, _1, _2));
150 #if BOOST_VERSION < 106600 151 s_io_service.reset();
153 s_io_service.restart();
167 while (s_io_service.run_one())
175 ec = readResult.get();
183 ec = system::error_code(system::errc::timed_out,
184 system::generic_category());
190 #if BOOST_VERSION < 106600 191 s_io_service.reset();
193 s_io_service.restart();
Definition: SyncTimedRead.h:63
Time and Duration wrapper class.
std::size_t read_some(SyncReadStream &s, const MutableBufferSequence &buffers, mira::Duration timeout)
Read some data from the specified stream 's' into the given buffer 'buffers'.
Definition: SyncTimedRead.h:108
Commonly used exception classes.
Use this class to represent time durations.
Definition: Time.h:106