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:
parent
b467e93875
commit
bd02adb85d
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue