diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:11:01 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:11:01 +0900 |
commit | 3fdc3e5ee96dca5b11d1694975a65200787eab86 (patch) | |
tree | 5c1733853892b8397d67706fa453a9bd978d2102 /boost/asio/detail/impl/signal_set_service.ipp | |
parent | 88e602c57797660ebe0f9e15dbd64c1ff16dead3 (diff) | |
download | boost-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.ipp | 56 |
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; } |