summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp')
-rw-r--r--3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp25
1 files changed, 25 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp b/3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp
index 9a0a872..59aa053 100644
--- a/3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp
+++ b/3rdParty/Boost/src/boost/asio/detail/impl/pipe_select_interrupter.ipp
@@ -38,6 +38,11 @@ namespace detail {
pipe_select_interrupter::pipe_select_interrupter()
{
+ open_descriptors();
+}
+
+void pipe_select_interrupter::open_descriptors()
+{
int pipe_fds[2];
if (pipe(pipe_fds) == 0)
{
@@ -45,6 +50,11 @@ pipe_select_interrupter::pipe_select_interrupter()
::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK);
write_descriptor_ = pipe_fds[1];
::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK);
+
+#if defined(FD_CLOEXEC)
+ ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC);
+ ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC);
+#endif // defined(FD_CLOEXEC)
}
else
{
@@ -56,12 +66,27 @@ pipe_select_interrupter::pipe_select_interrupter()
pipe_select_interrupter::~pipe_select_interrupter()
{
+ close_descriptors();
+}
+
+void pipe_select_interrupter::close_descriptors()
+{
if (read_descriptor_ != -1)
::close(read_descriptor_);
if (write_descriptor_ != -1)
::close(write_descriptor_);
}
+void pipe_select_interrupter::recreate()
+{
+ close_descriptors();
+
+ write_descriptor_ = -1;
+ read_descriptor_ = -1;
+
+ open_descriptors();
+}
+
void pipe_select_interrupter::interrupt()
{
char byte = 0;