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.
This commit is contained in:
Ken Brown 2019-05-09 12:28:21 -04:00
parent 7ad80b3c23
commit 102571f85d
2 changed files with 33 additions and 2 deletions

View File

@ -1274,6 +1274,7 @@ class fhandler_fifo: public fhandler_base
void delete_client_handler (int); void delete_client_handler (int);
bool listen_client (); bool listen_client ();
int stop_listen_client (); int stop_listen_client ();
int check_listen_client_thread ();
void record_connection (fifo_client_handler&); void record_connection (fifo_client_handler&);
public: public:
fhandler_fifo (); fhandler_fifo ();

View File

@ -744,13 +744,43 @@ retry:
return eof; 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 void __reg3
fhandler_fifo::raw_read (void *in_ptr, size_t& len) fhandler_fifo::raw_read (void *in_ptr, size_t& len)
{ {
size_t orig_len = len; size_t orig_len = len;
/* Start the listen_client thread if necessary (shouldn't be). */ /* Make sure the lct is running. */
if (!listen_client_thr && !listen_client ()) int res = check_listen_client_thread ();
debug_printf ("lct status %d", res);
if (res < 0 || (res == 0 && !listen_client ()))
goto errout; goto errout;
while (1) while (1)