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
8885be8934
commit
9f37882918
|
@ -1280,6 +1280,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 ();
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue