From c6e221c03668909f6c3fb399d8888629353b0191 Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Fri, 22 Mar 2019 19:30:38 +0000 Subject: [PATCH] Cygwin: FIFO: improve EOF detection Add a hit_eof method that tries to detect whether any clients are connected. Before concluding that there are none, it gives the listen_client thread time to update the client data. --- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_fifo.cc | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) 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; -- 2.43.5