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:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user