diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 997dc0b6d..af5f500bf 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1277,6 +1277,7 @@ class fhandler_fifo: public fhandler_base bool listen_client (); public: fhandler_fifo (); + bool hit_eof (); PUNICODE_STRING get_pipe_name (); DWORD listen_client_thread (); void fifo_client_lock () { _fifo_client_lock.lock (); } diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index b0016ee90..1dcb3b3df 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -654,6 +654,25 @@ fhandler_fifo::raw_write (const void *ptr, size_t len) return ret; } +/* A FIFO open for reading is at EOF if no process has it open for + writing. We test this by checking nconnected. But we must take + account of the possible delay from the time of connection to the + time the connection is recorded by the listen_client thread. */ +bool +fhandler_fifo::hit_eof () +{ + fifo_client_lock (); + bool eof = (nconnected == 0); + fifo_client_unlock (); + if (eof) + { + /* Give the listen_client thread time to catch up, then recheck. */ + Sleep (1); + eof = (nconnected == 0); + } + return eof; +} + void __reg3 fhandler_fifo::raw_read (void *in_ptr, size_t& len) { @@ -665,7 +684,7 @@ fhandler_fifo::raw_read (void *in_ptr, size_t& len) while (1) { - if (nconnected == 0) /* EOF */ + if (hit_eof ()) { len = 0; return;