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)