summaryrefslogtreecommitdiff
path: root/boost/asio/basic_waitable_timer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/asio/basic_waitable_timer.hpp')
-rw-r--r--boost/asio/basic_waitable_timer.hpp282
1 files changed, 234 insertions, 48 deletions
diff --git a/boost/asio/basic_waitable_timer.hpp b/boost/asio/basic_waitable_timer.hpp
index e4aeb0b7d8..3657d8b429 100644
--- a/boost/asio/basic_waitable_timer.hpp
+++ b/boost/asio/basic_waitable_timer.hpp
@@ -22,13 +22,37 @@
#include <boost/asio/detail/throw_error.hpp>
#include <boost/asio/error.hpp>
#include <boost/asio/wait_traits.hpp>
-#include <boost/asio/waitable_timer_service.hpp>
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+#if defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+# include <boost/asio/waitable_timer_service.hpp>
+#else // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+# include <boost/asio/detail/chrono_time_traits.hpp>
+# include <boost/asio/detail/deadline_timer_service.hpp>
+# define BOOST_ASIO_SVC_T \
+ detail::deadline_timer_service< \
+ detail::chrono_time_traits<Clock, WaitTraits> >
+#endif // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
#include <boost/asio/detail/push_options.hpp>
namespace boost {
namespace asio {
+#if !defined(BOOST_ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+#define BOOST_ASIO_BASIC_WAITABLE_TIMER_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Clock,
+ typename WaitTraits = boost::asio::wait_traits<Clock>
+ BOOST_ASIO_SVC_TPARAM_DEF2(= waitable_timer_service<Clock, WaitTraits>)>
+class basic_waitable_timer;
+
+#endif // !defined(BOOST_ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+
/// Provides waitable timer functionality.
/**
* The basic_waitable_timer class template provides the ability to perform a
@@ -52,10 +76,10 @@ namespace asio {
* Performing a blocking wait (C++11):
* @code
* // Construct a timer without setting an expiry time.
- * boost::asio::steady_timer timer(io_service);
+ * boost::asio::steady_timer timer(io_context);
*
* // Set an expiry time relative to now.
- * timer.expires_from_now(std::chrono::seconds(5));
+ * timer.expires_after(std::chrono::seconds(5));
*
* // Wait for the timer to expire.
* timer.wait();
@@ -75,7 +99,7 @@ namespace asio {
* ...
*
* // Construct a timer with an absolute expiry time.
- * boost::asio::steady_timer timer(io_service,
+ * boost::asio::steady_timer timer(io_context,
* std::chrono::steady_clock::now() + std::chrono::seconds(60));
*
* // Start an asynchronous wait.
@@ -92,7 +116,7 @@ namespace asio {
* @code
* void on_some_event()
* {
- * if (my_timer.expires_from_now(seconds(5)) > 0)
+ * if (my_timer.expires_after(seconds(5)) > 0)
* {
* // We managed to cancel the timer. Start new asynchronous wait.
* my_timer.async_wait(on_timeout);
@@ -112,7 +136,7 @@ namespace asio {
* }
* @endcode
*
- * @li The boost::asio::basic_waitable_timer::expires_from_now() function
+ * @li The boost::asio::basic_waitable_timer::expires_after() function
* cancels any pending asynchronous waits, and returns the number of
* asynchronous waits that were cancelled. If it returns 0 then you were too
* late and the wait handler has already been executed, or will soon be
@@ -121,13 +145,14 @@ namespace asio {
* @li If a wait handler is cancelled, the boost::system::error_code passed to
* it contains the value boost::asio::error::operation_aborted.
*/
-template <typename Clock,
- typename WaitTraits = boost::asio::wait_traits<Clock>,
- typename WaitableTimerService = waitable_timer_service<Clock, WaitTraits> >
+template <typename Clock, typename WaitTraits BOOST_ASIO_SVC_TPARAM>
class basic_waitable_timer
- : public basic_io_object<WaitableTimerService>
+ : BOOST_ASIO_SVC_ACCESS basic_io_object<BOOST_ASIO_SVC_T>
{
public:
+ /// The type of the executor associated with the object.
+ typedef io_context::executor_type executor_type;
+
/// The clock type.
typedef Clock clock_type;
@@ -143,14 +168,14 @@ public:
/// Constructor.
/**
* This constructor creates a timer without setting an expiry time. The
- * expires_at() or expires_from_now() functions must be called to set an
- * expiry time before the timer can be waited on.
+ * expires_at() or expires_after() functions must be called to set an expiry
+ * time before the timer can be waited on.
*
- * @param io_service The io_service object that the timer will use to dispatch
+ * @param io_context The io_context object that the timer will use to dispatch
* handlers for any asynchronous operations performed on the timer.
*/
- explicit basic_waitable_timer(boost::asio::io_service& io_service)
- : basic_io_object<WaitableTimerService>(io_service)
+ explicit basic_waitable_timer(boost::asio::io_context& io_context)
+ : basic_io_object<BOOST_ASIO_SVC_T>(io_context)
{
}
@@ -158,18 +183,18 @@ public:
/**
* This constructor creates a timer and sets the expiry time.
*
- * @param io_service The io_service object that the timer will use to dispatch
+ * @param io_context The io_context object that the timer will use to dispatch
* handlers for any asynchronous operations performed on the timer.
*
* @param expiry_time The expiry time to be used for the timer, expressed
* as an absolute time.
*/
- basic_waitable_timer(boost::asio::io_service& io_service,
+ basic_waitable_timer(boost::asio::io_context& io_context,
const time_point& expiry_time)
- : basic_io_object<WaitableTimerService>(io_service)
+ : basic_io_object<BOOST_ASIO_SVC_T>(io_context)
{
boost::system::error_code ec;
- this->service.expires_at(this->implementation, expiry_time, ec);
+ this->get_service().expires_at(this->get_implementation(), expiry_time, ec);
boost::asio::detail::throw_error(ec, "expires_at");
}
@@ -177,21 +202,105 @@ public:
/**
* This constructor creates a timer and sets the expiry time.
*
- * @param io_service The io_service object that the timer will use to dispatch
+ * @param io_context The io_context object that the timer will use to dispatch
* handlers for any asynchronous operations performed on the timer.
*
* @param expiry_time The expiry time to be used for the timer, relative to
* now.
*/
- basic_waitable_timer(boost::asio::io_service& io_service,
+ basic_waitable_timer(boost::asio::io_context& io_context,
const duration& expiry_time)
- : basic_io_object<WaitableTimerService>(io_service)
+ : basic_io_object<BOOST_ASIO_SVC_T>(io_context)
{
boost::system::error_code ec;
- this->service.expires_from_now(this->implementation, expiry_time, ec);
- boost::asio::detail::throw_error(ec, "expires_from_now");
+ this->get_service().expires_after(
+ this->get_implementation(), expiry_time, ec);
+ boost::asio::detail::throw_error(ec, "expires_after");
+ }
+
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_waitable_timer from another.
+ /**
+ * This constructor moves a timer from one object to another.
+ *
+ * @param other The other basic_waitable_timer object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_waitable_timer(io_context&) constructor.
+ */
+ basic_waitable_timer(basic_waitable_timer&& other)
+ : basic_io_object<BOOST_ASIO_SVC_T>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_waitable_timer from another.
+ /**
+ * This assignment operator moves a timer from one object to another. Cancels
+ * any outstanding asynchronous operations associated with the target object.
+ *
+ * @param other The other basic_waitable_timer object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_waitable_timer(io_context&) constructor.
+ */
+ basic_waitable_timer& operator=(basic_waitable_timer&& other)
+ {
+ basic_io_object<BOOST_ASIO_SVC_T>::operator=(std::move(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+ /// Destroys the timer.
+ /**
+ * This function destroys the timer, cancelling any outstanding asynchronous
+ * wait operations associated with the timer as if by calling @c cancel.
+ */
+ ~basic_waitable_timer()
+ {
+ }
+
+#if defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+ // These functions are provided by basic_io_object<>.
+#else // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use get_executor().) Get the io_context associated with the
+ /// object.
+ /**
+ * This function may be used to obtain the io_context object that the I/O
+ * object uses to dispatch handlers for asynchronous operations.
+ *
+ * @return A reference to the io_context object that the I/O object will use
+ * to dispatch handlers. Ownership is not transferred to the caller.
+ */
+ boost::asio::io_context& get_io_context()
+ {
+ return basic_io_object<BOOST_ASIO_SVC_T>::get_io_context();
}
+ /// (Deprecated: Use get_executor().) Get the io_context associated with the
+ /// object.
+ /**
+ * This function may be used to obtain the io_context object that the I/O
+ * object uses to dispatch handlers for asynchronous operations.
+ *
+ * @return A reference to the io_context object that the I/O object will use
+ * to dispatch handlers. Ownership is not transferred to the caller.
+ */
+ boost::asio::io_context& get_io_service()
+ {
+ return basic_io_object<BOOST_ASIO_SVC_T>::get_io_service();
+ }
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
+
+ /// Get the executor associated with the object.
+ executor_type get_executor() BOOST_ASIO_NOEXCEPT
+ {
+ return basic_io_object<BOOST_ASIO_SVC_T>::get_executor();
+ }
+#endif // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+
/// Cancel any asynchronous operations that are waiting on the timer.
/**
* This function forces the completion of any pending asynchronous wait
@@ -217,12 +326,14 @@ public:
std::size_t cancel()
{
boost::system::error_code ec;
- std::size_t s = this->service.cancel(this->implementation, ec);
+ std::size_t s = this->get_service().cancel(this->get_implementation(), ec);
boost::asio::detail::throw_error(ec, "cancel");
return s;
}
- /// Cancel any asynchronous operations that are waiting on the timer.
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use non-error_code overload.) Cancel any asynchronous
+ /// operations that are waiting on the timer.
/**
* This function forces the completion of any pending asynchronous wait
* operations against the timer. The handler for each cancelled operation will
@@ -246,8 +357,9 @@ public:
*/
std::size_t cancel(boost::system::error_code& ec)
{
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
}
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
/// Cancels one asynchronous operation that is waiting on the timer.
/**
@@ -276,12 +388,15 @@ public:
std::size_t cancel_one()
{
boost::system::error_code ec;
- std::size_t s = this->service.cancel_one(this->implementation, ec);
+ std::size_t s = this->get_service().cancel_one(
+ this->get_implementation(), ec);
boost::asio::detail::throw_error(ec, "cancel_one");
return s;
}
- /// Cancels one asynchronous operation that is waiting on the timer.
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use non-error_code overload.) Cancels one asynchronous
+ /// operation that is waiting on the timer.
/**
* This function forces the completion of one pending asynchronous wait
* operation against the timer. Handlers are cancelled in FIFO order. The
@@ -307,17 +422,29 @@ public:
*/
std::size_t cancel_one(boost::system::error_code& ec)
{
- return this->service.cancel_one(this->implementation, ec);
+ return this->get_service().cancel_one(this->get_implementation(), ec);
}
- /// Get the timer's expiry time as an absolute time.
+ /// (Deprecated: Use expiry().) Get the timer's expiry time as an absolute
+ /// time.
/**
* This function may be used to obtain the timer's current expiry time.
* Whether the timer has expired or not does not affect this value.
*/
time_point expires_at() const
{
- return this->service.expires_at(this->implementation);
+ return this->get_service().expires_at(this->get_implementation());
+ }
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
+
+ /// Get the timer's expiry time as an absolute time.
+ /**
+ * This function may be used to obtain the timer's current expiry time.
+ * Whether the timer has expired or not does not affect this value.
+ */
+ time_point expiry() const
+ {
+ return this->get_service().expiry(this->get_implementation());
}
/// Set the timer's expiry time as an absolute time.
@@ -345,13 +472,15 @@ public:
std::size_t expires_at(const time_point& expiry_time)
{
boost::system::error_code ec;
- std::size_t s = this->service.expires_at(
- this->implementation, expiry_time, ec);
+ std::size_t s = this->get_service().expires_at(
+ this->get_implementation(), expiry_time, ec);
boost::asio::detail::throw_error(ec, "expires_at");
return s;
}
- /// Set the timer's expiry time as an absolute time.
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use non-error_code overload.) Set the timer's expiry time as
+ /// an absolute time.
/**
* This function sets the expiry time. Any pending asynchronous wait
* operations will be cancelled. The handler for each cancelled operation will
@@ -376,20 +505,55 @@ public:
std::size_t expires_at(const time_point& expiry_time,
boost::system::error_code& ec)
{
- return this->service.expires_at(this->implementation, expiry_time, ec);
+ return this->get_service().expires_at(
+ this->get_implementation(), expiry_time, ec);
}
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
- /// Get the timer's expiry time relative to now.
+ /// Set the timer's expiry time relative to now.
+ /**
+ * This function sets the expiry time. Any pending asynchronous wait
+ * operations will be cancelled. The handler for each cancelled operation will
+ * be invoked with the boost::asio::error::operation_aborted error code.
+ *
+ * @param expiry_time The expiry time to be used for the timer.
+ *
+ * @return The number of asynchronous operations that were cancelled.
+ *
+ * @throws boost::system::system_error Thrown on failure.
+ *
+ * @note If the timer has already expired when expires_after() is called,
+ * then the handlers for asynchronous wait operations will:
+ *
+ * @li have already been invoked; or
+ *
+ * @li have been queued for invocation in the near future.
+ *
+ * These handlers can no longer be cancelled, and therefore are passed an
+ * error code that indicates the successful completion of the wait operation.
+ */
+ std::size_t expires_after(const duration& expiry_time)
+ {
+ boost::system::error_code ec;
+ std::size_t s = this->get_service().expires_after(
+ this->get_implementation(), expiry_time, ec);
+ boost::asio::detail::throw_error(ec, "expires_after");
+ return s;
+ }
+
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use expiry().) Get the timer's expiry time relative to now.
/**
* This function may be used to obtain the timer's current expiry time.
* Whether the timer has expired or not does not affect this value.
*/
duration expires_from_now() const
{
- return this->service.expires_from_now(this->implementation);
+ return this->get_service().expires_from_now(this->get_implementation());
}
- /// Set the timer's expiry time relative to now.
+ /// (Deprecated: Use expires_after().) Set the timer's expiry time relative
+ /// to now.
/**
* This function sets the expiry time. Any pending asynchronous wait
* operations will be cancelled. The handler for each cancelled operation will
@@ -414,13 +578,14 @@ public:
std::size_t expires_from_now(const duration& expiry_time)
{
boost::system::error_code ec;
- std::size_t s = this->service.expires_from_now(
- this->implementation, expiry_time, ec);
+ std::size_t s = this->get_service().expires_from_now(
+ this->get_implementation(), expiry_time, ec);
boost::asio::detail::throw_error(ec, "expires_from_now");
return s;
}
- /// Set the timer's expiry time relative to now.
+ /// (Deprecated: Use expires_after().) Set the timer's expiry time relative
+ /// to now.
/**
* This function sets the expiry time. Any pending asynchronous wait
* operations will be cancelled. The handler for each cancelled operation will
@@ -445,9 +610,10 @@ public:
std::size_t expires_from_now(const duration& expiry_time,
boost::system::error_code& ec)
{
- return this->service.expires_from_now(
- this->implementation, expiry_time, ec);
+ return this->get_service().expires_from_now(
+ this->get_implementation(), expiry_time, ec);
}
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
/// Perform a blocking wait on the timer.
/**
@@ -459,7 +625,7 @@ public:
void wait()
{
boost::system::error_code ec;
- this->service.wait(this->implementation, ec);
+ this->get_service().wait(this->get_implementation(), ec);
boost::asio::detail::throw_error(ec, "wait");
}
@@ -472,7 +638,7 @@ public:
*/
void wait(boost::system::error_code& ec)
{
- this->service.wait(this->implementation, ec);
+ this->get_service().wait(this->get_implementation(), ec);
}
/// Start an asynchronous wait on the timer.
@@ -497,7 +663,7 @@ public:
* Regardless of whether the asynchronous operation completes immediately or
* not, the handler will not be invoked from within this function. Invocation
* of the handler will be performed in a manner equivalent to using
- * boost::asio::io_service::post().
+ * boost::asio::io_context::post().
*/
template <typename WaitHandler>
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
@@ -508,9 +674,25 @@ public:
// not meet the documented type requirements for a WaitHandler.
BOOST_ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
- return this->service.async_wait(this->implementation,
+#if defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+ return this->get_service().async_wait(this->get_implementation(),
BOOST_ASIO_MOVE_CAST(WaitHandler)(handler));
+#else // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+ async_completion<WaitHandler,
+ void (boost::system::error_code)> init(handler);
+
+ this->get_service().async_wait(this->get_implementation(),
+ init.completion_handler);
+
+ return init.result.get();
+#endif // defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
}
+
+private:
+ // Disallow copying and assignment.
+ basic_waitable_timer(const basic_waitable_timer&) BOOST_ASIO_DELETED;
+ basic_waitable_timer& operator=(
+ const basic_waitable_timer&) BOOST_ASIO_DELETED;
};
} // namespace asio
@@ -518,4 +700,8 @@ public:
#include <boost/asio/detail/pop_options.hpp>
+#if !defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+# undef BOOST_ASIO_SVC_T
+#endif // !defined(BOOST_ASIO_ENABLE_OLD_SERVICES)
+
#endif // BOOST_ASIO_BASIC_WAITABLE_TIMER_HPP