http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_serial_port_service.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_serial_port_service.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_serial_port_service.ipp deleted file mode 100644 index 1974876..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_serial_port_service.ipp +++ /dev/null @@ -1,151 +0,0 @@ -// -// detail/impl/reactive_serial_port_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (i...@repinvariant.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) -// - -#ifndef ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP -#define ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include <cstring> -#include "asio/detail/reactive_serial_port_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -reactive_serial_port_service::reactive_serial_port_service( - asio::io_service& io_service) - : descriptor_service_(io_service) -{ -} - -void reactive_serial_port_service::shutdown_service() -{ - descriptor_service_.shutdown_service(); -} - -asio::error_code reactive_serial_port_service::open( - reactive_serial_port_service::implementation_type& impl, - const std::string& device, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - descriptor_ops::state_type state = 0; - int fd = descriptor_ops::open(device.c_str(), - O_RDWR | O_NONBLOCK | O_NOCTTY, ec); - if (fd < 0) - return ec; - - int s = descriptor_ops::fcntl(fd, F_GETFL, ec); - if (s >= 0) - s = descriptor_ops::fcntl(fd, F_SETFL, s | O_NONBLOCK, ec); - if (s < 0) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - return ec; - } - - // Set up default serial port options. - termios ios; - errno = 0; - s = descriptor_ops::error_wrapper(::tcgetattr(fd, &ios), ec); - if (s >= 0) - { -#if defined(_BSD_SOURCE) - ::cfmakeraw(&ios); -#else - ios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK - | ISTRIP | INLCR | IGNCR | ICRNL | IXON); - ios.c_oflag &= ~OPOST; - ios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); - ios.c_cflag &= ~(CSIZE | PARENB); - ios.c_cflag |= CS8; -#endif - ios.c_iflag |= IGNPAR; - ios.c_cflag |= CREAD | CLOCAL; - errno = 0; - s = descriptor_ops::error_wrapper(::tcsetattr(fd, TCSANOW, &ios), ec); - } - if (s < 0) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - return ec; - } - - // We're done. Take ownership of the serial port descriptor. - if (descriptor_service_.assign(impl, fd, ec)) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - } - - return ec; -} - -asio::error_code reactive_serial_port_service::do_set_option( - reactive_serial_port_service::implementation_type& impl, - reactive_serial_port_service::store_function_type store, - const void* option, asio::error_code& ec) -{ - termios ios; - errno = 0; - descriptor_ops::error_wrapper(::tcgetattr( - descriptor_service_.native_handle(impl), &ios), ec); - if (ec) - return ec; - - if (store(option, ios, ec)) - return ec; - - errno = 0; - descriptor_ops::error_wrapper(::tcsetattr( - descriptor_service_.native_handle(impl), TCSANOW, &ios), ec); - return ec; -} - -asio::error_code reactive_serial_port_service::do_get_option( - const reactive_serial_port_service::implementation_type& impl, - reactive_serial_port_service::load_function_type load, - void* option, asio::error_code& ec) const -{ - termios ios; - errno = 0; - descriptor_ops::error_wrapper(::tcgetattr( - descriptor_service_.native_handle(impl), &ios), ec); - if (ec) - return ec; - - return load(option, ios, ec); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) -#endif // defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP
http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_socket_service_base.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_socket_service_base.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_socket_service_base.ipp deleted file mode 100644 index a0363ed..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/reactive_socket_service_base.ipp +++ /dev/null @@ -1,267 +0,0 @@ -// -// detail/reactive_socket_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_IOCP) \ - && !defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/reactive_socket_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -reactive_socket_service_base::reactive_socket_service_base( - asio::io_service& io_service) - : reactor_(use_service<reactor>(io_service)) -{ - reactor_.init_task(); -} - -void reactive_socket_service_base::shutdown_service() -{ -} - -void reactive_socket_service_base::construct( - reactive_socket_service_base::base_implementation_type& impl) -{ - impl.socket_ = invalid_socket; - impl.state_ = 0; -} - -void reactive_socket_service_base::base_move_construct( - reactive_socket_service_base::base_implementation_type& impl, - reactive_socket_service_base::base_implementation_type& other_impl) -{ - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - reactor_.move_descriptor(impl.socket_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_socket_service_base::base_move_assign( - reactive_socket_service_base::base_implementation_type& impl, - reactive_socket_service_base& other_service, - reactive_socket_service_base::base_implementation_type& other_impl) -{ - destroy(impl); - - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - other_service.reactor_.move_descriptor(impl.socket_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_socket_service_base::destroy( - reactive_socket_service_base::base_implementation_type& impl) -{ - if (impl.socket_ != invalid_socket) - { - ASIO_HANDLER_OPERATION(("socket", &impl, "close")); - - reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, - (impl.state_ & socket_ops::possible_dup) == 0); - - asio::error_code ignored_ec; - socket_ops::close(impl.socket_, impl.state_, true, ignored_ec); - } -} - -asio::error_code reactive_socket_service_base::close( - reactive_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION(("socket", &impl, "close")); - - reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, - (impl.state_ & socket_ops::possible_dup) == 0); - } - - socket_ops::close(impl.socket_, impl.state_, false, ec); - - // The descriptor is closed by the OS even if close() returns an error. - // - // (Actually, POSIX says the state of the descriptor is unspecified. On - // Linux the descriptor is apparently closed anyway; e.g. see - // http://lkml.org/lkml/2005/9/10/129 - // We'll just have to assume that other OSes follow the same behaviour. The - // known exception is when Windows's closesocket() function fails with - // WSAEWOULDBLOCK, but this case is handled inside socket_ops::close(). - construct(impl); - - return ec; -} - -asio::error_code reactive_socket_service_base::cancel( - reactive_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - ASIO_HANDLER_OPERATION(("socket", &impl, "cancel")); - - reactor_.cancel_ops(impl.socket_, impl.reactor_data_); - ec = asio::error_code(); - return ec; -} - -asio::error_code reactive_socket_service_base::do_open( - reactive_socket_service_base::base_implementation_type& impl, - int af, int type, int protocol, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - socket_holder sock(socket_ops::socket(af, type, protocol, ec)); - if (sock.get() == invalid_socket) - return ec; - - if (int err = reactor_.register_descriptor(sock.get(), impl.reactor_data_)) - { - ec = asio::error_code(err, - asio::error::get_system_category()); - return ec; - } - - impl.socket_ = sock.release(); - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - ec = asio::error_code(); - return ec; -} - -asio::error_code reactive_socket_service_base::do_assign( - reactive_socket_service_base::base_implementation_type& impl, int type, - const reactive_socket_service_base::native_handle_type& native_socket, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - if (int err = reactor_.register_descriptor( - native_socket, impl.reactor_data_)) - { - ec = asio::error_code(err, - asio::error::get_system_category()); - return ec; - } - - impl.socket_ = native_socket; - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - impl.state_ |= socket_ops::possible_dup; - ec = asio::error_code(); - return ec; -} - -void reactive_socket_service_base::start_op( - reactive_socket_service_base::base_implementation_type& impl, - int op_type, reactor_op* op, bool is_continuation, - bool is_non_blocking, bool noop) -{ - if (!noop) - { - if ((impl.state_ & socket_ops::non_blocking) - || socket_ops::set_internal_non_blocking( - impl.socket_, impl.state_, true, op->ec_)) - { - reactor_.start_op(op_type, impl.socket_, - impl.reactor_data_, op, is_continuation, is_non_blocking); - return; - } - } - - reactor_.post_immediate_completion(op, is_continuation); -} - -void reactive_socket_service_base::start_accept_op( - reactive_socket_service_base::base_implementation_type& impl, - reactor_op* op, bool is_continuation, bool peer_is_open) -{ - if (!peer_is_open) - start_op(impl, reactor::read_op, op, true, is_continuation, false); - else - { - op->ec_ = asio::error::already_open; - reactor_.post_immediate_completion(op, is_continuation); - } -} - -void reactive_socket_service_base::start_connect_op( - reactive_socket_service_base::base_implementation_type& impl, - reactor_op* op, bool is_continuation, - const socket_addr_type* addr, size_t addrlen) -{ - if ((impl.state_ & socket_ops::non_blocking) - || socket_ops::set_internal_non_blocking( - impl.socket_, impl.state_, true, op->ec_)) - { - if (socket_ops::connect(impl.socket_, addr, addrlen, op->ec_) != 0) - { - if (op->ec_ == asio::error::in_progress - || op->ec_ == asio::error::would_block) - { - op->ec_ = asio::error_code(); - reactor_.start_op(reactor::connect_op, impl.socket_, - impl.reactor_data_, op, is_continuation, false); - return; - } - } - } - - reactor_.post_immediate_completion(op, is_continuation); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_IOCP) - // && !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/resolver_service_base.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/resolver_service_base.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/resolver_service_base.ipp deleted file mode 100644 index 2f99983..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/resolver_service_base.ipp +++ /dev/null @@ -1,130 +0,0 @@ -// -// detail/impl/resolver_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/resolver_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class resolver_service_base::work_io_service_runner -{ -public: - work_io_service_runner(asio::io_service& io_service) - : io_service_(io_service) {} - void operator()() { io_service_.run(); } -private: - asio::io_service& io_service_; -}; - -resolver_service_base::resolver_service_base( - asio::io_service& io_service) - : io_service_impl_(asio::use_service<io_service_impl>(io_service)), - work_io_service_(new asio::io_service), - work_io_service_impl_(asio::use_service< - io_service_impl>(*work_io_service_)), - work_(new asio::io_service::work(*work_io_service_)), - work_thread_(0) -{ -} - -resolver_service_base::~resolver_service_base() -{ - shutdown_service(); -} - -void resolver_service_base::shutdown_service() -{ - work_.reset(); - if (work_io_service_.get()) - { - work_io_service_->stop(); - if (work_thread_.get()) - { - work_thread_->join(); - work_thread_.reset(); - } - work_io_service_.reset(); - } -} - -void resolver_service_base::fork_service( - asio::io_service::fork_event fork_ev) -{ - if (work_thread_.get()) - { - if (fork_ev == asio::io_service::fork_prepare) - { - work_io_service_->stop(); - work_thread_->join(); - } - else - { - work_io_service_->reset(); - work_thread_.reset(new asio::detail::thread( - work_io_service_runner(*work_io_service_))); - } - } -} - -void resolver_service_base::construct( - resolver_service_base::implementation_type& impl) -{ - impl.reset(static_cast<void*>(0), socket_ops::noop_deleter()); -} - -void resolver_service_base::destroy( - resolver_service_base::implementation_type& impl) -{ - ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel")); - - impl.reset(); -} - -void resolver_service_base::cancel( - resolver_service_base::implementation_type& impl) -{ - ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel")); - - impl.reset(static_cast<void*>(0), socket_ops::noop_deleter()); -} - -void resolver_service_base::start_resolve_op(operation* op) -{ - start_work_thread(); - io_service_impl_.work_started(); - work_io_service_impl_.post_immediate_completion(op, false); -} - -void resolver_service_base::start_work_thread() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - if (!work_thread_.get()) - { - work_thread_.reset(new asio::detail::thread( - work_io_service_runner(*work_io_service_))); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.hpp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.hpp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.hpp deleted file mode 100644 index 5572472..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// detail/impl/select_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP -#define ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) \ - || (!defined(ASIO_HAS_DEV_POLL) \ - && !defined(ASIO_HAS_EPOLL) \ - && !defined(ASIO_HAS_KQUEUE) \ - && !defined(ASIO_WINDOWS_RUNTIME)) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template <typename Time_Traits> -void select_reactor::add_timer_queue(timer_queue<Time_Traits>& queue) -{ - do_add_timer_queue(queue); -} - -// Remove a timer queue from the reactor. -template <typename Time_Traits> -void select_reactor::remove_timer_queue(timer_queue<Time_Traits>& queue) -{ - do_remove_timer_queue(queue); -} - -template <typename Time_Traits> -void select_reactor::schedule_timer(timer_queue<Time_Traits>& queue, - const typename Time_Traits::time_type& time, - typename timer_queue<Time_Traits>::per_timer_data& timer, wait_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - io_service_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - io_service_.work_started(); - if (earliest) - interrupter_.interrupt(); -} - -template <typename Time_Traits> -std::size_t select_reactor::cancel_timer(timer_queue<Time_Traits>& queue, - typename timer_queue<Time_Traits>::per_timer_data& timer, - std::size_t max_cancelled) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue<operation> ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - io_service_.post_deferred_completions(ops); - return n; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - // || (!defined(ASIO_HAS_DEV_POLL) - // && !defined(ASIO_HAS_EPOLL) - // && !defined(ASIO_HAS_KQUEUE) - // && !defined(ASIO_WINDOWS_RUNTIME)) - -#endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.ipp deleted file mode 100644 index d1ae2e9..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/select_reactor.ipp +++ /dev/null @@ -1,313 +0,0 @@ -// -// detail/impl/select_reactor.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP -#define ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) \ - || (!defined(ASIO_HAS_DEV_POLL) \ - && !defined(ASIO_HAS_EPOLL) \ - && !defined(ASIO_HAS_KQUEUE) \ - && !defined(ASIO_WINDOWS_RUNTIME)) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fd_set_adapter.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -select_reactor::select_reactor(asio::io_service& io_service) - : asio::detail::service_base<select_reactor>(io_service), - io_service_(use_service<io_service_impl>(io_service)), - mutex_(), - interrupter_(), -#if defined(ASIO_HAS_IOCP) - stop_thread_(false), - thread_(0), -#endif // defined(ASIO_HAS_IOCP) - shutdown_(false) -{ -#if defined(ASIO_HAS_IOCP) - asio::detail::signal_blocker sb; - thread_ = new asio::detail::thread( - bind_handler(&select_reactor::call_run_thread, this)); -#endif // defined(ASIO_HAS_IOCP) -} - -select_reactor::~select_reactor() -{ - shutdown_service(); -} - -void select_reactor::shutdown_service() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; -#if defined(ASIO_HAS_IOCP) - stop_thread_ = true; -#endif // defined(ASIO_HAS_IOCP) - lock.unlock(); - -#if defined(ASIO_HAS_IOCP) - if (thread_) - { - interrupter_.interrupt(); - thread_->join(); - delete thread_; - thread_ = 0; - } -#endif // defined(ASIO_HAS_IOCP) - - op_queue<operation> ops; - - for (int i = 0; i < max_ops; ++i) - op_queue_[i].get_all_operations(ops); - - timer_queues_.get_all_timers(ops); - - io_service_.abandon_operations(ops); -} - -void select_reactor::fork_service(asio::io_service::fork_event fork_ev) -{ - if (fork_ev == asio::io_service::fork_child) - interrupter_.recreate(); -} - -void select_reactor::init_task() -{ - io_service_.init_task(); -} - -int select_reactor::register_descriptor(socket_type, - select_reactor::per_descriptor_data&) -{ - return 0; -} - -int select_reactor::register_internal_descriptor( - int op_type, socket_type descriptor, - select_reactor::per_descriptor_data&, reactor_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - op_queue_[op_type].enqueue_operation(descriptor, op); - interrupter_.interrupt(); - - return 0; -} - -void select_reactor::move_descriptor(socket_type, - select_reactor::per_descriptor_data&, - select_reactor::per_descriptor_data&) -{ -} - -void select_reactor::start_op(int op_type, socket_type descriptor, - select_reactor::per_descriptor_data&, reactor_op* op, - bool is_continuation, bool) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - post_immediate_completion(op, is_continuation); - return; - } - - bool first = op_queue_[op_type].enqueue_operation(descriptor, op); - io_service_.work_started(); - if (first) - interrupter_.interrupt(); -} - -void select_reactor::cancel_ops(socket_type descriptor, - select_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void select_reactor::deregister_descriptor(socket_type descriptor, - select_reactor::per_descriptor_data&, bool) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void select_reactor::deregister_internal_descriptor( - socket_type descriptor, select_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue<operation> ops; - for (int i = 0; i < max_ops; ++i) - op_queue_[i].cancel_operations(descriptor, ops); -} - -void select_reactor::run(bool block, op_queue<operation>& ops) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - -#if defined(ASIO_HAS_IOCP) - // Check if the thread is supposed to stop. - if (stop_thread_) - return; -#endif // defined(ASIO_HAS_IOCP) - - // Set up the descriptor sets. - for (int i = 0; i < max_select_ops; ++i) - fd_sets_[i].reset(); - fd_sets_[read_op].set(interrupter_.read_descriptor()); - socket_type max_fd = 0; - bool have_work_to_do = !timer_queues_.all_empty(); - for (int i = 0; i < max_select_ops; ++i) - { - have_work_to_do = have_work_to_do || !op_queue_[i].empty(); - fd_sets_[i].set(op_queue_[i], ops); - if (fd_sets_[i].max_descriptor() > max_fd) - max_fd = fd_sets_[i].max_descriptor(); - } - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Connection operations on Windows use both except and write fd_sets. - have_work_to_do = have_work_to_do || !op_queue_[connect_op].empty(); - fd_sets_[write_op].set(op_queue_[connect_op], ops); - if (fd_sets_[write_op].max_descriptor() > max_fd) - max_fd = fd_sets_[write_op].max_descriptor(); - fd_sets_[except_op].set(op_queue_[connect_op], ops); - if (fd_sets_[except_op].max_descriptor() > max_fd) - max_fd = fd_sets_[except_op].max_descriptor(); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (!block && !have_work_to_do) - return; - - // Determine how long to block while waiting for events. - timeval tv_buf = { 0, 0 }; - timeval* tv = block ? get_timeout(tv_buf) : &tv_buf; - - lock.unlock(); - - // Block on the select call until descriptors become ready. - asio::error_code ec; - int retval = socket_ops::select(static_cast<int>(max_fd + 1), - fd_sets_[read_op], fd_sets_[write_op], fd_sets_[except_op], tv, ec); - - // Reset the interrupter. - if (retval > 0 && fd_sets_[read_op].is_set(interrupter_.read_descriptor())) - { - interrupter_.reset(); - --retval; - } - - lock.lock(); - - // Dispatch all ready operations. - if (retval > 0) - { -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Connection operations on Windows use both except and write fd_sets. - fd_sets_[except_op].perform(op_queue_[connect_op], ops); - fd_sets_[write_op].perform(op_queue_[connect_op], ops); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - for (int i = max_select_ops - 1; i >= 0; --i) - fd_sets_[i].perform(op_queue_[i], ops); - } - timer_queues_.get_ready_timers(ops); -} - -void select_reactor::interrupt() -{ - interrupter_.interrupt(); -} - -#if defined(ASIO_HAS_IOCP) -void select_reactor::run_thread() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - lock.unlock(); - op_queue<operation> ops; - run(true, ops); - io_service_.post_deferred_completions(ops); - lock.lock(); - } -} - -void select_reactor::call_run_thread(select_reactor* reactor) -{ - reactor->run_thread(); -} -#endif // defined(ASIO_HAS_IOCP) - -void select_reactor::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void select_reactor::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -timeval* select_reactor::get_timeout(timeval& tv) -{ - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000); - tv.tv_sec = usec / 1000000; - tv.tv_usec = usec % 1000000; - return &tv; -} - -void select_reactor::cancel_ops_unlocked(socket_type descriptor, - const asio::error_code& ec) -{ - bool need_interrupt = false; - op_queue<operation> ops; - for (int i = 0; i < max_ops; ++i) - need_interrupt = op_queue_[i].cancel_operations( - descriptor, ops, ec) || need_interrupt; - io_service_.post_deferred_completions(ops); - if (need_interrupt) - interrupter_.interrupt(); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - // || (!defined(ASIO_HAS_DEV_POLL) - // && !defined(ASIO_HAS_EPOLL) - // && !defined(ASIO_HAS_KQUEUE)) - // && !defined(ASIO_WINDOWS_RUNTIME)) - -#endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.hpp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.hpp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.hpp deleted file mode 100644 index 722773f..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// -// detail/impl/service_registry.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP -#define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template <typename Service, typename Arg> -service_registry::service_registry( - asio::io_service& o, Service*, Arg arg) - : owner_(o), - first_service_(new Service(o, arg)) -{ - asio::io_service::service::key key; - init_key(key, Service::id); - first_service_->key_ = key; - first_service_->next_ = 0; -} - -template <typename Service> -Service& service_registry::first_service() -{ - return *static_cast<Service*>(first_service_); -} - -template <typename Service> -Service& service_registry::use_service() -{ - asio::io_service::service::key key; - init_key(key, Service::id); - factory_type factory = &service_registry::create<Service>; - return *static_cast<Service*>(do_use_service(key, factory)); -} - -template <typename Service> -void service_registry::add_service(Service* new_service) -{ - asio::io_service::service::key key; - init_key(key, Service::id); - return do_add_service(key, new_service); -} - -template <typename Service> -bool service_registry::has_service() const -{ - asio::io_service::service::key key; - init_key(key, Service::id); - return do_has_service(key); -} - -#if !defined(ASIO_NO_TYPEID) -template <typename Service> -void service_registry::init_key(asio::io_service::service::key& key, - const asio::detail::service_id<Service>& /*id*/) -{ - key.type_info_ = &typeid(typeid_wrapper<Service>); - key.id_ = 0; -} -#endif // !defined(ASIO_NO_TYPEID) - -template <typename Service> -asio::io_service::service* service_registry::create( - asio::io_service& owner) -{ - return new Service(owner); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.ipp deleted file mode 100644 index b5e66dc..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/service_registry.ipp +++ /dev/null @@ -1,188 +0,0 @@ -// -// detail/impl/service_registry.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP -#define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include <vector> -#include "asio/detail/service_registry.hpp" -#include "asio/detail/throw_exception.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -service_registry::~service_registry() -{ - // Shutdown all services. This must be done in a separate loop before the - // services are destroyed since the destructors of user-defined handler - // objects may try to access other service objects. - asio::io_service::service* service = first_service_; - while (service) - { - service->shutdown_service(); - service = service->next_; - } - - // Destroy all services. - while (first_service_) - { - asio::io_service::service* next_service = first_service_->next_; - destroy(first_service_); - first_service_ = next_service; - } -} - -void service_registry::notify_fork(asio::io_service::fork_event fork_ev) -{ - // Make a copy of all of the services while holding the lock. We don't want - // to hold the lock while calling into each service, as it may try to call - // back into this class. - std::vector<asio::io_service::service*> services; - { - asio::detail::mutex::scoped_lock lock(mutex_); - asio::io_service::service* service = first_service_; - while (service) - { - services.push_back(service); - service = service->next_; - } - } - - // If processing the fork_prepare event, we want to go in reverse order of - // service registration, which happens to be the existing order of the - // services in the vector. For the other events we want to go in the other - // direction. - std::size_t num_services = services.size(); - if (fork_ev == asio::io_service::fork_prepare) - for (std::size_t i = 0; i < num_services; ++i) - services[i]->fork_service(fork_ev); - else - for (std::size_t i = num_services; i > 0; --i) - services[i - 1]->fork_service(fork_ev); -} - -void service_registry::init_key(asio::io_service::service::key& key, - const asio::io_service::id& id) -{ - key.type_info_ = 0; - key.id_ = &id; -} - -bool service_registry::keys_match( - const asio::io_service::service::key& key1, - const asio::io_service::service::key& key2) -{ - if (key1.id_ && key2.id_) - if (key1.id_ == key2.id_) - return true; - if (key1.type_info_ && key2.type_info_) - if (*key1.type_info_ == *key2.type_info_) - return true; - return false; -} - -void service_registry::destroy(asio::io_service::service* service) -{ - delete service; -} - -asio::io_service::service* service_registry::do_use_service( - const asio::io_service::service::key& key, - factory_type factory) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - // First see if there is an existing service object with the given key. - asio::io_service::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return service; - service = service->next_; - } - - // Create a new service object. The service registry's mutex is not locked - // at this time to allow for nested calls into this function from the new - // service's constructor. - lock.unlock(); - auto_service_ptr new_service = { factory(owner_) }; - new_service.ptr_->key_ = key; - lock.lock(); - - // Check that nobody else created another service object of the same type - // while the lock was released. - service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return service; - service = service->next_; - } - - // Service was successfully initialised, pass ownership to registry. - new_service.ptr_->next_ = first_service_; - first_service_ = new_service.ptr_; - new_service.ptr_ = 0; - return first_service_; -} - -void service_registry::do_add_service( - const asio::io_service::service::key& key, - asio::io_service::service* new_service) -{ - if (&owner_ != &new_service->get_io_service()) - asio::detail::throw_exception(invalid_service_owner()); - - asio::detail::mutex::scoped_lock lock(mutex_); - - // Check if there is an existing service object with the given key. - asio::io_service::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - asio::detail::throw_exception(service_already_exists()); - service = service->next_; - } - - // Take ownership of the service object. - new_service->key_ = key; - new_service->next_ = first_service_; - first_service_ = new_service; -} - -bool service_registry::do_has_service( - const asio::io_service::service::key& key) const -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - asio::io_service::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return true; - service = service->next_; - } - - return false; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP http://git-wip-us.apache.org/repos/asf/hadoop/blob/76a1e894/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/signal_set_service.ipp ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/signal_set_service.ipp b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/signal_set_service.ipp deleted file mode 100644 index 2429b4d..0000000 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/native/libhdfspp/third_party/asio-1.10.2/include/asio/detail/impl/signal_set_service.ipp +++ /dev/null @@ -1,647 +0,0 @@ -// -// detail/impl/signal_set_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 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) -// - -#ifndef ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP -#define ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include <cstring> -#include "asio/detail/reactor.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/signal_set_service.hpp" -#include "asio/detail/static_mutex.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct signal_state -{ - // Mutex used for protecting global state. - static_mutex mutex_; - - // The read end of the pipe used for signal notifications. - int read_descriptor_; - - // The write end of the pipe used for signal notifications. - int write_descriptor_; - - // Whether the signal state has been prepared for a fork. - bool fork_prepared_; - - // The head of a linked list of all signal_set_service instances. - class signal_set_service* service_list_; - - // A count of the number of objects that are registered for each signal. - std::size_t registration_count_[max_signal_number]; -}; - -signal_state* get_signal_state() -{ - static signal_state state = { - ASIO_STATIC_MUTEX_INIT, -1, -1, false, 0, { 0 } }; - return &state; -} - -void asio_signal_handler(int signal_number) -{ -#if defined(ASIO_WINDOWS) \ - || defined(ASIO_WINDOWS_RUNTIME) \ - || defined(__CYGWIN__) - signal_set_service::deliver_signal(signal_number); -#else // defined(ASIO_WINDOWS) - // || defined(ASIO_WINDOWS_RUNTIME) - // || defined(__CYGWIN__) - int saved_errno = errno; - signal_state* state = get_signal_state(); - signed_size_type result = ::write(state->write_descriptor_, - &signal_number, sizeof(signal_number)); - (void)result; - errno = saved_errno; -#endif // defined(ASIO_WINDOWS) - // || defined(ASIO_WINDOWS_RUNTIME) - // || defined(__CYGWIN__) - -#if defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) - ::signal(signal_number, asio_signal_handler); -#endif // defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) -} - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -class signal_set_service::pipe_read_op : public reactor_op -{ -public: - pipe_read_op() - : reactor_op(&pipe_read_op::do_perform, pipe_read_op::do_complete) - { - } - - static bool do_perform(reactor_op*) - { - signal_state* state = get_signal_state(); - - int fd = state->read_descriptor_; - int signal_number = 0; - while (::read(fd, &signal_number, sizeof(int)) == sizeof(int)) - if (signal_number >= 0 && signal_number < max_signal_number) - signal_set_service::deliver_signal(signal_number); - - return false; - } - - static void do_complete(io_service_impl* /*owner*/, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - pipe_read_op* o(static_cast<pipe_read_op*>(base)); - delete o; - } -}; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -signal_set_service::signal_set_service( - asio::io_service& io_service) - : io_service_(asio::use_service<io_service_impl>(io_service)), -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - reactor_(asio::use_service<reactor>(io_service)), -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - next_(0), - prev_(0) -{ - get_signal_state()->mutex_.init(); - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - reactor_.init_task(); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - - for (int i = 0; i < max_signal_number; ++i) - registrations_[i] = 0; - - add_service(this); -} - -signal_set_service::~signal_set_service() -{ - remove_service(this); -} - -void signal_set_service::shutdown_service() -{ - remove_service(this); - - op_queue<operation> ops; - - for (int i = 0; i < max_signal_number; ++i) - { - registration* reg = registrations_[i]; - while (reg) - { - ops.push(*reg->queue_); - reg = reg->next_in_table_; - } - } - - io_service_.abandon_operations(ops); -} - -void signal_set_service::fork_service( - asio::io_service::fork_event fork_ev) -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - switch (fork_ev) - { - case asio::io_service::fork_prepare: - { - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = true; - lock.unlock(); - reactor_.deregister_internal_descriptor(read_descriptor, reactor_data_); - } - break; - case asio::io_service::fork_parent: - if (state->fork_prepared_) - { - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = false; - lock.unlock(); - reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, reactor_data_, new pipe_read_op); - } - break; - case asio::io_service::fork_child: - if (state->fork_prepared_) - { - asio::detail::signal_blocker blocker; - close_descriptors(); - open_descriptors(); - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = false; - lock.unlock(); - reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, reactor_data_, new pipe_read_op); - } - break; - default: - break; - } -#else // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - (void)fork_ev; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::construct( - signal_set_service::implementation_type& impl) -{ - impl.signals_ = 0; -} - -void signal_set_service::destroy( - signal_set_service::implementation_type& impl) -{ - asio::error_code ignored_ec; - clear(impl, ignored_ec); - cancel(impl, ignored_ec); -} - -asio::error_code signal_set_service::add( - signal_set_service::implementation_type& impl, - int signal_number, asio::error_code& ec) -{ - // Check that the signal number is valid. - if (signal_number < 0 || signal_number > max_signal_number) - { - ec = asio::error::invalid_argument; - return ec; - } - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - // Find the appropriate place to insert the registration. - registration** insertion_point = &impl.signals_; - registration* next = impl.signals_; - while (next && next->signal_number_ < signal_number) - { - insertion_point = &next->next_in_set_; - next = next->next_in_set_; - } - - // Only do something if the signal is not already registered. - if (next == 0 || next->signal_number_ != signal_number) - { - registration* new_registration = new registration; - -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Register for the signal if we're the first. - if (state->registration_count_[signal_number] == 0) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = asio_signal_handler; - sigfillset(&sa.sa_mask); - if (::sigaction(signal_number, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(signal_number, asio_signal_handler) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - delete new_registration; - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Record the new registration in the set. - new_registration->signal_number_ = signal_number; - new_registration->queue_ = &impl.queue_; - new_registration->next_in_set_ = next; - *insertion_point = new_registration; - - // Insert registration into the registration table. - new_registration->next_in_table_ = registrations_[signal_number]; - if (registrations_[signal_number]) - registrations_[signal_number]->prev_in_table_ = new_registration; - registrations_[signal_number] = new_registration; - - ++state->registration_count_[signal_number]; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::remove( - signal_set_service::implementation_type& impl, - int signal_number, asio::error_code& ec) -{ - // Check that the signal number is valid. - if (signal_number < 0 || signal_number > max_signal_number) - { - ec = asio::error::invalid_argument; - return ec; - } - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - // Find the signal number in the list of registrations. - registration** deletion_point = &impl.signals_; - registration* reg = impl.signals_; - while (reg && reg->signal_number_ < signal_number) - { - deletion_point = ®->next_in_set_; - reg = reg->next_in_set_; - } - - if (reg != 0 && reg->signal_number_ == signal_number) - { -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Set signal handler back to the default if we're the last. - if (state->registration_count_[signal_number] == 1) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_DFL; - if (::sigaction(signal_number, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(signal_number, SIG_DFL) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Remove the registration from the set. - *deletion_point = reg->next_in_set_; - - // Remove the registration from the registration table. - if (registrations_[signal_number] == reg) - registrations_[signal_number] = reg->next_in_table_; - if (reg->prev_in_table_) - reg->prev_in_table_->next_in_table_ = reg->next_in_table_; - if (reg->next_in_table_) - reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; - - --state->registration_count_[signal_number]; - - delete reg; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::clear( - signal_set_service::implementation_type& impl, - asio::error_code& ec) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - while (registration* reg = impl.signals_) - { -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Set signal handler back to the default if we're the last. - if (state->registration_count_[reg->signal_number_] == 1) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_DFL; - if (::sigaction(reg->signal_number_, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(reg->signal_number_, SIG_DFL) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Remove the registration from the registration table. - if (registrations_[reg->signal_number_] == reg) - registrations_[reg->signal_number_] = reg->next_in_table_; - if (reg->prev_in_table_) - reg->prev_in_table_->next_in_table_ = reg->next_in_table_; - if (reg->next_in_table_) - reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; - - --state->registration_count_[reg->signal_number_]; - - impl.signals_ = reg->next_in_set_; - delete reg; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::cancel( - signal_set_service::implementation_type& impl, - asio::error_code& ec) -{ - ASIO_HANDLER_OPERATION(("signal_set", &impl, "cancel")); - - op_queue<operation> ops; - { - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - while (signal_op* op = impl.queue_.front()) - { - op->ec_ = asio::error::operation_aborted; - impl.queue_.pop(); - ops.push(op); - } - } - - io_service_.post_deferred_completions(ops); - - ec = asio::error_code(); - return ec; -} - -void signal_set_service::deliver_signal(int signal_number) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - signal_set_service* service = state->service_list_; - while (service) - { - op_queue<operation> ops; - - registration* reg = service->registrations_[signal_number]; - while (reg) - { - if (reg->queue_->empty()) - { - ++reg->undelivered_; - } - else - { - while (signal_op* op = reg->queue_->front()) - { - op->signal_number_ = signal_number; - reg->queue_->pop(); - ops.push(op); - } - } - - reg = reg->next_in_table_; - } - - service->io_service_.post_deferred_completions(ops); - - service = service->next_; - } -} - -void signal_set_service::add_service(signal_set_service* service) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - // If this is the first service to be created, open a new pipe. - if (state->service_list_ == 0) - open_descriptors(); -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - - // Insert service into linked list of all services. - service->next_ = state->service_list_; - service->prev_ = 0; - if (state->service_list_) - state->service_list_->prev_ = service; - state->service_list_ = service; - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - // Register for pipe readiness notifications. - int read_descriptor = state->read_descriptor_; - lock.unlock(); - service->reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, service->reactor_data_, new pipe_read_op); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::remove_service(signal_set_service* service) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - if (service->next_ || service->prev_ || state->service_list_ == service) - { -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - // Disable the pipe readiness notifications. - int read_descriptor = state->read_descriptor_; - lock.unlock(); - service->reactor_.deregister_descriptor( - read_descriptor, service->reactor_data_, false); - lock.lock(); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - - // Remove service from linked list of all services. - if (state->service_list_ == service) - state->service_list_ = service->next_; - if (service->prev_) - service->prev_->next_ = service->next_; - if (service->next_) - service->next_->prev_= service->prev_; - service->next_ = 0; - service->prev_ = 0; - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - // If this is the last service to be removed, close the pipe. - if (state->service_list_ == 0) - close_descriptors(); -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - } -} - -void signal_set_service::open_descriptors() -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - - int pipe_fds[2]; - if (::pipe(pipe_fds) == 0) - { - state->read_descriptor_ = pipe_fds[0]; - ::fcntl(state->read_descriptor_, F_SETFL, O_NONBLOCK); - - state->write_descriptor_ = pipe_fds[1]; - ::fcntl(state->write_descriptor_, F_SETFL, O_NONBLOCK); - -#if defined(FD_CLOEXEC) - ::fcntl(state->read_descriptor_, F_SETFD, FD_CLOEXEC); - ::fcntl(state->write_descriptor_, F_SETFD, FD_CLOEXEC); -#endif // defined(FD_CLOEXEC) - } - else - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "signal_set_service pipe"); - } -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::close_descriptors() -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - - if (state->read_descriptor_ != -1) - ::close(state->read_descriptor_); - state->read_descriptor_ = -1; - - if (state->write_descriptor_ != -1) - ::close(state->write_descriptor_); - state->write_descriptor_ = -1; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::start_wait_op( - signal_set_service::implementation_type& impl, signal_op* op) -{ - io_service_.work_started(); - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - registration* reg = impl.signals_; - while (reg) - { - if (reg->undelivered_ > 0) - { - --reg->undelivered_; - op->signal_number_ = reg->signal_number_; - io_service_.post_deferred_completion(op); - return; - } - - reg = reg->next_in_set_; - } - - impl.queue_.push(op); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP