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