summaryrefslogtreecommitdiff
path: root/boost/asio/detail/impl/signal_set_service.ipp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:11:01 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:11:01 +0900
commit3fdc3e5ee96dca5b11d1694975a65200787eab86 (patch)
tree5c1733853892b8397d67706fa453a9bd978d2102 /boost/asio/detail/impl/signal_set_service.ipp
parent88e602c57797660ebe0f9e15dbd64c1ff16dead3 (diff)
downloadboost-3fdc3e5ee96dca5b11d1694975a65200787eab86.tar.gz
boost-3fdc3e5ee96dca5b11d1694975a65200787eab86.tar.bz2
boost-3fdc3e5ee96dca5b11d1694975a65200787eab86.zip
Imported Upstream version 1.66.0upstream/1.66.0
Diffstat (limited to 'boost/asio/detail/impl/signal_set_service.ipp')
-rw-r--r--boost/asio/detail/impl/signal_set_service.ipp56
1 files changed, 38 insertions, 18 deletions
diff --git a/boost/asio/detail/impl/signal_set_service.ipp b/boost/asio/detail/impl/signal_set_service.ipp
index 95ea8bee21..376d311471 100644
--- a/boost/asio/detail/impl/signal_set_service.ipp
+++ b/boost/asio/detail/impl/signal_set_service.ipp
@@ -18,10 +18,12 @@
#include <boost/asio/detail/config.hpp>
#include <cstring>
+#include <stdexcept>
#include <boost/asio/detail/reactor.hpp>
#include <boost/asio/detail/signal_blocker.hpp>
#include <boost/asio/detail/signal_set_service.hpp>
#include <boost/asio/detail/static_mutex.hpp>
+#include <boost/asio/detail/throw_exception.hpp>
#include <boost/asio/detail/push_options.hpp>
@@ -92,7 +94,7 @@ public:
{
}
- static bool do_perform(reactor_op*)
+ static status do_perform(reactor_op*)
{
signal_state* state = get_signal_state();
@@ -102,10 +104,10 @@ public:
if (signal_number >= 0 && signal_number < max_signal_number)
signal_set_service::deliver_signal(signal_number);
- return false;
+ return not_done;
}
- static void do_complete(io_service_impl* /*owner*/, operation* base,
+ static void do_complete(void* /*owner*/, operation* base,
const boost::system::error_code& /*ec*/,
std::size_t /*bytes_transferred*/)
{
@@ -118,12 +120,13 @@ public:
// && !defined(__CYGWIN__)
signal_set_service::signal_set_service(
- boost::asio::io_service& io_service)
- : io_service_(boost::asio::use_service<io_service_impl>(io_service)),
+ boost::asio::io_context& io_context)
+ : service_base<signal_set_service>(io_context),
+ io_context_(boost::asio::use_service<io_context_impl>(io_context)),
#if !defined(BOOST_ASIO_WINDOWS) \
&& !defined(BOOST_ASIO_WINDOWS_RUNTIME) \
&& !defined(__CYGWIN__)
- reactor_(boost::asio::use_service<reactor>(io_service)),
+ reactor_(boost::asio::use_service<reactor>(io_context)),
#endif // !defined(BOOST_ASIO_WINDOWS)
// && !defined(BOOST_ASIO_WINDOWS_RUNTIME)
// && !defined(__CYGWIN__)
@@ -151,7 +154,7 @@ signal_set_service::~signal_set_service()
remove_service(this);
}
-void signal_set_service::shutdown_service()
+void signal_set_service::shutdown()
{
remove_service(this);
@@ -167,11 +170,11 @@ void signal_set_service::shutdown_service()
}
}
- io_service_.abandon_operations(ops);
+ io_context_.abandon_operations(ops);
}
-void signal_set_service::fork_service(
- boost::asio::io_service::fork_event fork_ev)
+void signal_set_service::notify_fork(
+ boost::asio::io_context::fork_event fork_ev)
{
#if !defined(BOOST_ASIO_WINDOWS) \
&& !defined(BOOST_ASIO_WINDOWS_RUNTIME) \
@@ -181,7 +184,7 @@ void signal_set_service::fork_service(
switch (fork_ev)
{
- case boost::asio::io_service::fork_prepare:
+ case boost::asio::io_context::fork_prepare:
{
int read_descriptor = state->read_descriptor_;
state->fork_prepared_ = true;
@@ -190,7 +193,7 @@ void signal_set_service::fork_service(
reactor_.cleanup_descriptor_data(reactor_data_);
}
break;
- case boost::asio::io_service::fork_parent:
+ case boost::asio::io_context::fork_parent:
if (state->fork_prepared_)
{
int read_descriptor = state->read_descriptor_;
@@ -200,7 +203,7 @@ void signal_set_service::fork_service(
read_descriptor, reactor_data_, new pipe_read_op);
}
break;
- case boost::asio::io_service::fork_child:
+ case boost::asio::io_context::fork_child:
if (state->fork_prepared_)
{
boost::asio::detail::signal_blocker blocker;
@@ -439,7 +442,8 @@ boost::system::error_code signal_set_service::cancel(
signal_set_service::implementation_type& impl,
boost::system::error_code& ec)
{
- BOOST_ASIO_HANDLER_OPERATION(("signal_set", &impl, "cancel"));
+ BOOST_ASIO_HANDLER_OPERATION((io_context_.context(),
+ "signal_set", &impl, 0, "cancel"));
op_queue<operation> ops;
{
@@ -454,7 +458,7 @@ boost::system::error_code signal_set_service::cancel(
}
}
- io_service_.post_deferred_completions(ops);
+ io_context_.post_deferred_completions(ops);
ec = boost::system::error_code();
return ec;
@@ -490,7 +494,7 @@ void signal_set_service::deliver_signal(int signal_number)
reg = reg->next_in_table_;
}
- service->io_service_.post_deferred_completions(ops);
+ service->io_context_.post_deferred_completions(ops);
service = service->next_;
}
@@ -507,6 +511,22 @@ void signal_set_service::add_service(signal_set_service* service)
open_descriptors();
#endif // !defined(BOOST_ASIO_WINDOWS) && !defined(__CYGWIN__)
+ // If an io_context object is thread-unsafe then it must be the only
+ // io_context used to create signal_set objects.
+ if (state->service_list_ != 0)
+ {
+ if (!BOOST_ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER,
+ service->io_context_.concurrency_hint())
+ || !BOOST_ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER,
+ state->service_list_->io_context_.concurrency_hint()))
+ {
+ std::logic_error ex(
+ "Thread-unsafe io_context objects require "
+ "exclusive access to signal handling.");
+ boost::asio::detail::throw_exception(ex);
+ }
+ }
+
// Insert service into linked list of all services.
service->next_ = state->service_list_;
service->prev_ = 0;
@@ -620,7 +640,7 @@ void signal_set_service::close_descriptors()
void signal_set_service::start_wait_op(
signal_set_service::implementation_type& impl, signal_op* op)
{
- io_service_.work_started();
+ io_context_.work_started();
signal_state* state = get_signal_state();
static_mutex::scoped_lock lock(state->mutex_);
@@ -632,7 +652,7 @@ void signal_set_service::start_wait_op(
{
--reg->undelivered_;
op->signal_number_ = reg->signal_number_;
- io_service_.post_deferred_completion(op);
+ io_context_.post_deferred_completion(op);
return;
}