diff options
Diffstat (limited to 'boost/asio/detail/impl/dev_poll_reactor.ipp')
-rw-r--r-- | boost/asio/detail/impl/dev_poll_reactor.ipp | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/boost/asio/detail/impl/dev_poll_reactor.ipp b/boost/asio/detail/impl/dev_poll_reactor.ipp index a648bf1532..e9210be2b0 100644 --- a/boost/asio/detail/impl/dev_poll_reactor.ipp +++ b/boost/asio/detail/impl/dev_poll_reactor.ipp @@ -2,7 +2,7 @@ // detail/impl/dev_poll_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -19,8 +19,8 @@ #if defined(BOOST_ASIO_HAS_DEV_POLL) -#include <boost/assert.hpp> #include <boost/asio/detail/dev_poll_reactor.hpp> +#include <boost/asio/detail/assert.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/error.hpp> @@ -68,27 +68,6 @@ void dev_poll_reactor::shutdown_service() io_service_.abandon_operations(ops); } -// Helper class to re-register all descriptors with /dev/poll. -class dev_poll_reactor::fork_helper -{ -public: - fork_helper(dev_poll_reactor* reactor, short events) - : reactor_(reactor), events_(events) - { - } - - bool set(int descriptor) - { - ::pollfd& ev = reactor_->add_pending_event_change(descriptor); - ev.events = events_; - return true; - } - -private: - dev_poll_reactor* reactor_; - short events_; -}; - void dev_poll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev) { if (fork_ev == boost::asio::io_service::fork_child) @@ -111,18 +90,24 @@ void dev_poll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev) // Re-register all descriptors with /dev/poll. The changes will be written // to the /dev/poll descriptor the next time the reactor is run. - op_queue<operation> ops; - fork_helper read_op_helper(this, POLLERR | POLLHUP | POLLIN); - op_queue_[read_op].get_descriptors(read_op_helper, ops); - fork_helper write_op_helper(this, POLLERR | POLLHUP | POLLOUT); - op_queue_[write_op].get_descriptors(write_op_helper, ops); - fork_helper except_op_helper(this, POLLERR | POLLHUP | POLLPRI); - op_queue_[except_op].get_descriptors(except_op_helper, ops); + for (int i = 0; i < max_ops; ++i) + { + reactor_op_queue<socket_type>::iterator iter = op_queue_[i].begin(); + reactor_op_queue<socket_type>::iterator end = op_queue_[i].end(); + for (; iter != end; ++iter) + { + ::pollfd& pending_ev = add_pending_event_change(iter->first); + pending_ev.events |= POLLERR | POLLHUP; + switch (i) + { + case read_op: pending_ev.events |= POLLIN; break; + case write_op: pending_ev.events |= POLLOUT; break; + case except_op: pending_ev.events |= POLLPRI; break; + default: break; + } + } + } interrupter_.interrupt(); - - // The ops op_queue will always be empty because the fork_helper's set() - // member function never returns false. - BOOST_ASSERT(ops.empty()); } } @@ -163,14 +148,14 @@ void dev_poll_reactor::move_descriptor(socket_type, } void dev_poll_reactor::start_op(int op_type, socket_type descriptor, - dev_poll_reactor::per_descriptor_data&, - reactor_op* op, bool allow_speculative) + dev_poll_reactor::per_descriptor_data&, reactor_op* op, + bool is_continuation, bool allow_speculative) { boost::asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { - post_immediate_completion(op); + post_immediate_completion(op, is_continuation); return; } @@ -183,7 +168,7 @@ void dev_poll_reactor::start_op(int op_type, socket_type descriptor, if (op->perform()) { lock.unlock(); - io_service_.post_immediate_completion(op); + io_service_.post_immediate_completion(op, is_continuation); return; } } |