summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/fhandler.h1
-rw-r--r--winsup/cygwin/fhandler_fifo.cc21
2 files changed, 21 insertions, 1 deletions
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;