Cygwin: check for STATUS_PENDING in fhandler_base::raw_read
If NtReadFile returns STATUS_PENDING, wait for the read to complete. This can happen, for instance, in the case of a FIFO opened with O_RDRW.
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							513f050cbf
						
					
				
				
					commit
					10bf30bebf
				
			| @@ -215,11 +215,23 @@ fhandler_base::raw_read (void *ptr, size_t& len) | |||||||
|   NTSTATUS status; |   NTSTATUS status; | ||||||
|   IO_STATUS_BLOCK io; |   IO_STATUS_BLOCK io; | ||||||
|   int try_noreserve = 1; |   int try_noreserve = 1; | ||||||
|  |   DWORD waitret = WAIT_OBJECT_0; | ||||||
|  |  | ||||||
| retry: | retry: | ||||||
|   status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, ptr, len, |   status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, ptr, len, | ||||||
| 		       NULL, NULL); | 		       NULL, NULL); | ||||||
|   if (NT_SUCCESS (status)) |   if (status == STATUS_PENDING) | ||||||
|  |     { | ||||||
|  |       waitret = cygwait (get_handle (), cw_infinite, | ||||||
|  | 			 cw_cancel | cw_sig_eintr); | ||||||
|  |       if (waitret == WAIT_OBJECT_0) | ||||||
|  | 	status = io.Status; | ||||||
|  |     } | ||||||
|  |   if (waitret == WAIT_CANCELED) | ||||||
|  |     pthread::static_cancel_self (); | ||||||
|  |   else if (waitret == WAIT_SIGNALED) | ||||||
|  |     set_errno (EINTR); | ||||||
|  |   else if (NT_SUCCESS (status)) | ||||||
|     len = io.Information; |     len = io.Information; | ||||||
|   else |   else | ||||||
|     { |     { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user