diff options
author | Ken Brown <kbrown@cornell.edu> | 2019-04-25 18:21:11 -0400 |
---|---|---|
committer | Ken Brown <kbrown@cornell.edu> | 2019-04-26 07:45:37 -0400 |
commit | 440559c40a4879ddfe0a73282aab994c53955cef (patch) | |
tree | 2262115bb5e07799e7edbf3fc1d6f31099d3769a | |
parent | f527171a9395f316889e0e2b12fffac14bdf98c4 (diff) | |
download | cygnal-440559c40a4879ddfe0a73282aab994c53955cef.tar.gz cygnal-440559c40a4879ddfe0a73282aab994c53955cef.tar.bz2 cygnal-440559c40a4879ddfe0a73282aab994c53955cef.zip |
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.
-rw-r--r-- | winsup/cygwin/fhandler.h | 1 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_fifo.cc | 16 |
2 files changed, 17 insertions, 0 deletions
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) { |