annotate DEPENDENCIES/generic/include/boost/asio/detail/impl/pipe_select_interrupter.ipp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 //
Chris@16 2 // detail/impl/pipe_select_interrupter.ipp
Chris@16 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Chris@16 4 //
Chris@101 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 //
Chris@16 10
Chris@16 11 #ifndef BOOST_ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP
Chris@16 12 #define BOOST_ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP
Chris@16 13
Chris@16 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 15 # pragma once
Chris@16 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 17
Chris@16 18 #include <boost/asio/detail/config.hpp>
Chris@16 19
Chris@16 20 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 21 #if !defined(BOOST_ASIO_WINDOWS)
Chris@16 22 #if !defined(__CYGWIN__)
Chris@16 23 #if !defined(__SYMBIAN32__)
Chris@16 24 #if !defined(BOOST_ASIO_HAS_EVENTFD)
Chris@16 25
Chris@16 26 #include <fcntl.h>
Chris@16 27 #include <sys/stat.h>
Chris@16 28 #include <sys/types.h>
Chris@16 29 #include <unistd.h>
Chris@16 30 #include <boost/asio/detail/pipe_select_interrupter.hpp>
Chris@16 31 #include <boost/asio/detail/socket_types.hpp>
Chris@16 32 #include <boost/asio/detail/throw_error.hpp>
Chris@16 33 #include <boost/asio/error.hpp>
Chris@16 34
Chris@16 35 #include <boost/asio/detail/push_options.hpp>
Chris@16 36
Chris@16 37 namespace boost {
Chris@16 38 namespace asio {
Chris@16 39 namespace detail {
Chris@16 40
Chris@16 41 pipe_select_interrupter::pipe_select_interrupter()
Chris@16 42 {
Chris@16 43 open_descriptors();
Chris@16 44 }
Chris@16 45
Chris@16 46 void pipe_select_interrupter::open_descriptors()
Chris@16 47 {
Chris@16 48 int pipe_fds[2];
Chris@16 49 if (pipe(pipe_fds) == 0)
Chris@16 50 {
Chris@16 51 read_descriptor_ = pipe_fds[0];
Chris@16 52 ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK);
Chris@16 53 write_descriptor_ = pipe_fds[1];
Chris@16 54 ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK);
Chris@16 55
Chris@16 56 #if defined(FD_CLOEXEC)
Chris@16 57 ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC);
Chris@16 58 ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC);
Chris@16 59 #endif // defined(FD_CLOEXEC)
Chris@16 60 }
Chris@16 61 else
Chris@16 62 {
Chris@16 63 boost::system::error_code ec(errno,
Chris@16 64 boost::asio::error::get_system_category());
Chris@16 65 boost::asio::detail::throw_error(ec, "pipe_select_interrupter");
Chris@16 66 }
Chris@16 67 }
Chris@16 68
Chris@16 69 pipe_select_interrupter::~pipe_select_interrupter()
Chris@16 70 {
Chris@16 71 close_descriptors();
Chris@16 72 }
Chris@16 73
Chris@16 74 void pipe_select_interrupter::close_descriptors()
Chris@16 75 {
Chris@16 76 if (read_descriptor_ != -1)
Chris@16 77 ::close(read_descriptor_);
Chris@16 78 if (write_descriptor_ != -1)
Chris@16 79 ::close(write_descriptor_);
Chris@16 80 }
Chris@16 81
Chris@16 82 void pipe_select_interrupter::recreate()
Chris@16 83 {
Chris@16 84 close_descriptors();
Chris@16 85
Chris@16 86 write_descriptor_ = -1;
Chris@16 87 read_descriptor_ = -1;
Chris@16 88
Chris@16 89 open_descriptors();
Chris@16 90 }
Chris@16 91
Chris@16 92 void pipe_select_interrupter::interrupt()
Chris@16 93 {
Chris@16 94 char byte = 0;
Chris@16 95 signed_size_type result = ::write(write_descriptor_, &byte, 1);
Chris@16 96 (void)result;
Chris@16 97 }
Chris@16 98
Chris@16 99 bool pipe_select_interrupter::reset()
Chris@16 100 {
Chris@16 101 for (;;)
Chris@16 102 {
Chris@16 103 char data[1024];
Chris@16 104 signed_size_type bytes_read = ::read(read_descriptor_, data, sizeof(data));
Chris@16 105 if (bytes_read < 0 && errno == EINTR)
Chris@16 106 continue;
Chris@16 107 bool was_interrupted = (bytes_read > 0);
Chris@16 108 while (bytes_read == sizeof(data))
Chris@16 109 bytes_read = ::read(read_descriptor_, data, sizeof(data));
Chris@16 110 return was_interrupted;
Chris@16 111 }
Chris@16 112 }
Chris@16 113
Chris@16 114 } // namespace detail
Chris@16 115 } // namespace asio
Chris@16 116 } // namespace boost
Chris@16 117
Chris@16 118 #include <boost/asio/detail/pop_options.hpp>
Chris@16 119
Chris@16 120 #endif // !defined(BOOST_ASIO_HAS_EVENTFD)
Chris@16 121 #endif // !defined(__SYMBIAN32__)
Chris@16 122 #endif // !defined(__CYGWIN__)
Chris@16 123 #endif // !defined(BOOST_ASIO_WINDOWS)
Chris@16 124 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 125
Chris@16 126 #endif // BOOST_ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP