[PATCH fifo 4/8] Cygwin: FIFO: improve EOF detection
Ken Brown
kbrown@cornell.edu
Fri Mar 22 19:31:00 GMT 2019
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.17.0
More information about the Cygwin-patches
mailing list