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.
This commit is contained in:
Ken Brown 2019-04-25 18:21:11 -04:00
parent b467e93875
commit bd02adb85d
2 changed files with 17 additions and 0 deletions

View File

@ -1300,6 +1300,7 @@ public:
int open (int, mode_t); int open (int, mode_t);
off_t lseek (off_t offset, int whence); off_t lseek (off_t offset, int whence);
int close (); int close ();
int fcntl (int cmd, intptr_t);
int dup (fhandler_base *child, int); int dup (fhandler_base *child, int);
bool isfifo () const { return true; } bool isfifo () const { return true; }
void set_close_on_exec (bool val); void set_close_on_exec (bool val);

View File

@ -891,6 +891,22 @@ fhandler_fifo::close ()
return fhandler_base::close () || ret; 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 int
fhandler_fifo::dup (fhandler_base *child, int flags) fhandler_fifo::dup (fhandler_base *child, int flags)
{ {