1// 2// detail/pipe_select_interrupter.hpp 3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4// 5// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6// 7// Distributed under the Boost Software License, Version 1.0. (See accompanying 8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9// 10 11#ifndef ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP 12#define ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP 13 14 15#include "asio/detail/config.hpp" 16 17 18#include "asio/detail/push_options.hpp" 19 20namespace asio { 21namespace detail { 22 23class pipe_select_interrupter 24{ 25public: 26 // Constructor. 27 ASIO_DECL pipe_select_interrupter(); 28 29 // Destructor. 30 ASIO_DECL ~pipe_select_interrupter(); 31 32 // Recreate the interrupter's descriptors. Used after a fork. 33 ASIO_DECL void recreate(); 34 35 // Interrupt the select call. 36 ASIO_DECL void interrupt(); 37 38 // Reset the select interrupt. Returns true if the call was interrupted. 39 ASIO_DECL bool reset(); 40 41 // Get the read descriptor to be passed to select. 42 int read_descriptor() const 43 { 44 return read_descriptor_; 45 } 46 47private: 48 // Open the descriptors. Throws on error. 49 ASIO_DECL void open_descriptors(); 50 51 // Close the descriptors. 52 ASIO_DECL void close_descriptors(); 53 54 // The read end of a connection used to interrupt the select call. This file 55 // descriptor is passed to select such that when it is time to stop, a single 56 // byte will be written on the other end of the connection and this 57 // descriptor will become readable. 58 int read_descriptor_; 59 60 // The write end of a connection used to interrupt the select call. A single 61 // byte may be written to this to wake up the select which is waiting for the 62 // other end to become readable. 63 int write_descriptor_; 64}; 65 66} // namespace detail 67} // namespace asio 68 69#include "asio/detail/pop_options.hpp" 70 71# include "asio/detail/impl/pipe_select_interrupter.ipp" 72 73 74#endif // ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP 75