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:
parent
7ad80b3c23
commit
102571f85d
|
@ -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 ();
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue