From 440559c40a4879ddfe0a73282aab994c53955cef Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Thu, 25 Apr 2019 18:21:11 -0400 Subject: [PATCH] Cygwin: FIFO: synchronize the blocking mode of a writer's pipe The blocking mode of the Windows pipe underlying a writer is set to match that of the writer itself when the latter is opened. Define fhandler_fifo::fcntl to keep the pipe and the writer in sync if the blocking mode is changed via fcntl. --- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_fifo.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 0df25aa40..f5ed61cc4 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1294,6 +1294,7 @@ public: int open (int, mode_t); off_t lseek (off_t offset, int whence); int close (); + int fcntl (int cmd, intptr_t); int dup (fhandler_base *child, int); bool isfifo () const { return true; } void set_close_on_exec (bool val); diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index ac2196c92..a1e395bf6 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -891,6 +891,22 @@ fhandler_fifo::close () return fhandler_base::close () || ret; } +/* If we're a writer, keep the nonblocking state of the windows pipe + in sync with our nonblocking state. */ +int +fhandler_fifo::fcntl (int cmd, intptr_t arg) +{ + if (cmd != F_SETFL || !writer) + return fhandler_base::fcntl (cmd, arg); + + const bool was_nonblocking = is_nonblocking (); + int res = fhandler_base::fcntl (cmd, arg); + const bool now_nonblocking = is_nonblocking (); + if (now_nonblocking != was_nonblocking) + set_pipe_non_blocking (get_handle (), now_nonblocking); + return res; +} + int fhandler_fifo::dup (fhandler_base *child, int flags) {