Cygwin: FIFO: improve EOF detection
Add a hit_eof method that tries to detect whether any clients are connected. Before concluding that there are none, it gives the listen_client thread time to update the client data.
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							c75e077f99
						
					
				
				
					commit
					c6e221c036
				
			| @@ -1277,6 +1277,7 @@ class fhandler_fifo: public fhandler_base | |||||||
|   bool listen_client (); |   bool listen_client (); | ||||||
| public: | public: | ||||||
|   fhandler_fifo (); |   fhandler_fifo (); | ||||||
|  |   bool hit_eof (); | ||||||
|   PUNICODE_STRING get_pipe_name (); |   PUNICODE_STRING get_pipe_name (); | ||||||
|   DWORD listen_client_thread (); |   DWORD listen_client_thread (); | ||||||
|   void fifo_client_lock () { _fifo_client_lock.lock (); } |   void fifo_client_lock () { _fifo_client_lock.lock (); } | ||||||
|   | |||||||
| @@ -654,6 +654,25 @@ fhandler_fifo::raw_write (const void *ptr, size_t len) | |||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* A FIFO open for reading is at EOF if no process has it open for | ||||||
|  |    writing.  We test this by checking nconnected.  But we must take | ||||||
|  |    account of the possible delay from the time of connection to the | ||||||
|  |    time the connection is recorded by the listen_client thread. */ | ||||||
|  | bool | ||||||
|  | fhandler_fifo::hit_eof () | ||||||
|  | { | ||||||
|  |   fifo_client_lock (); | ||||||
|  |   bool eof = (nconnected == 0); | ||||||
|  |   fifo_client_unlock (); | ||||||
|  |   if (eof) | ||||||
|  |     { | ||||||
|  |       /* Give the listen_client thread time to catch up, then recheck. */ | ||||||
|  |       Sleep (1); | ||||||
|  |       eof = (nconnected == 0); | ||||||
|  |     } | ||||||
|  |   return eof; | ||||||
|  | } | ||||||
|  |  | ||||||
| void __reg3 | void __reg3 | ||||||
| fhandler_fifo::raw_read (void *in_ptr, size_t& len) | fhandler_fifo::raw_read (void *in_ptr, size_t& len) | ||||||
| { | { | ||||||
| @@ -665,7 +684,7 @@ fhandler_fifo::raw_read (void *in_ptr, size_t& len) | |||||||
|  |  | ||||||
|   while (1) |   while (1) | ||||||
|     { |     { | ||||||
|       if (nconnected == 0)	/* EOF */ |       if (hit_eof ()) | ||||||
| 	{ | 	{ | ||||||
| 	  len = 0; | 	  len = 0; | ||||||
| 	  return; | 	  return; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user