From 102571f85da6344591848df2c8ebc200699cb031 Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Thu, 9 May 2019 12:28:21 -0400 Subject: [PATCH] Cygwin: FIFO: improve the check for the listen_client thread Add a method fhandler_fifo::check_listen_client_thread that checks whether the thread is running. Use it in raw_read instead of just testing the handle listen_client_thr. --- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_fifo.cc | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index f4c0f0301..969b23a14 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1274,6 +1274,7 @@ class fhandler_fifo: public fhandler_base void delete_client_handler (int); bool listen_client (); int stop_listen_client (); + int check_listen_client_thread (); void record_connection (fifo_client_handler&); public: fhandler_fifo (); diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index 1b1b3c7eb..4bf157d39 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -744,13 +744,43 @@ retry: return eof; } +/* Is the lct running? */ +int +fhandler_fifo::check_listen_client_thread () +{ + int ret = 0; + + if (listen_client_thr) + { + DWORD waitret = WaitForSingleObject (listen_client_thr, 0); + switch (waitret) + { + case WAIT_OBJECT_0: + CloseHandle (listen_client_thr); + break; + case WAIT_TIMEOUT: + ret = 1; + break; + default: + debug_printf ("WaitForSingleObject failed, %E"); + ret = -1; + __seterrno (); + CloseHandle (listen_client_thr); + break; + } + } + return ret; +} + void __reg3 fhandler_fifo::raw_read (void *in_ptr, size_t& len) { size_t orig_len = len; - /* Start the listen_client thread if necessary (shouldn't be). */ - if (!listen_client_thr && !listen_client ()) + /* Make sure the lct is running. */ + int res = check_listen_client_thread (); + debug_printf ("lct status %d", res); + if (res < 0 || (res == 0 && !listen_client ())) goto errout; while (1)