Chris@16: // Chris@16: // detail/posix_fd_set_adapter.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP Chris@16: #define BOOST_ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: Chris@16: #if !defined(BOOST_ASIO_WINDOWS) \ Chris@16: && !defined(__CYGWIN__) \ Chris@16: && !defined(BOOST_ASIO_WINDOWS_RUNTIME) Chris@16: Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: // Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. Chris@16: class posix_fd_set_adapter : noncopyable Chris@16: { Chris@16: public: Chris@16: posix_fd_set_adapter() Chris@16: : max_descriptor_(invalid_socket) Chris@16: { Chris@16: using namespace std; // Needed for memset on Solaris. Chris@16: FD_ZERO(&fd_set_); Chris@16: } Chris@16: Chris@16: void reset() Chris@16: { Chris@16: using namespace std; // Needed for memset on Solaris. Chris@16: FD_ZERO(&fd_set_); Chris@16: } Chris@16: Chris@16: bool set(socket_type descriptor) Chris@16: { Chris@16: if (descriptor < (socket_type)FD_SETSIZE) Chris@16: { Chris@16: if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_) Chris@16: max_descriptor_ = descriptor; Chris@16: FD_SET(descriptor, &fd_set_); Chris@16: return true; Chris@16: } Chris@16: return false; Chris@16: } Chris@16: Chris@101: void set(reactor_op_queue& operations, op_queue& ops) Chris@101: { Chris@101: reactor_op_queue::iterator i = operations.begin(); Chris@101: while (i != operations.end()) Chris@101: { Chris@101: reactor_op_queue::iterator op_iter = i++; Chris@101: if (!set(op_iter->first)) Chris@101: { Chris@101: boost::system::error_code ec(error::fd_set_failure); Chris@101: operations.cancel_operations(op_iter, ops, ec); Chris@101: } Chris@101: } Chris@101: } Chris@101: Chris@16: bool is_set(socket_type descriptor) const Chris@16: { Chris@16: return FD_ISSET(descriptor, &fd_set_) != 0; Chris@16: } Chris@16: Chris@16: operator fd_set*() Chris@16: { Chris@16: return &fd_set_; Chris@16: } Chris@16: Chris@16: socket_type max_descriptor() const Chris@16: { Chris@16: return max_descriptor_; Chris@16: } Chris@16: Chris@101: void perform(reactor_op_queue& operations, Chris@101: op_queue& ops) const Chris@101: { Chris@101: reactor_op_queue::iterator i = operations.begin(); Chris@101: while (i != operations.end()) Chris@101: { Chris@101: reactor_op_queue::iterator op_iter = i++; Chris@101: if (is_set(op_iter->first)) Chris@101: operations.perform_operations(op_iter, ops); Chris@101: } Chris@101: } Chris@101: Chris@16: private: Chris@16: mutable fd_set fd_set_; Chris@16: socket_type max_descriptor_; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // !defined(BOOST_ASIO_WINDOWS) Chris@16: // && !defined(__CYGWIN__) Chris@16: // && !defined(BOOST_ASIO_WINDOWS_RUNTIME) Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP