summaryrefslogtreecommitdiff
path: root/boost/asio/detail/impl/dev_poll_reactor.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/asio/detail/impl/dev_poll_reactor.ipp')
-rw-r--r--boost/asio/detail/impl/dev_poll_reactor.ipp61
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;
}
}