Cygwin: pipes: don't call NtQueryInformationFile on read side of pipes
NtQueryInformationFile hangs if it's called on the read side handle of a pipe while another thread or process is performing a blocking read. Avoid select potentially hanging by calling NtQueryInformationFile only on the write side of the pipe and using PeekNamedPipe otherwise. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
f961a63ed6
commit
34b1447040
|
@ -587,6 +587,14 @@ no_verify (select_record *, fd_set *, fd_set *, fd_set *)
|
|||
static int
|
||||
pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
|
||||
{
|
||||
if (fh->get_device () == FH_PIPER)
|
||||
{
|
||||
DWORD nbytes_in_pipe;
|
||||
if (!writing && PeekNamedPipe (h, NULL, 0, NULL, &nbytes_in_pipe, NULL))
|
||||
return nbytes_in_pipe > 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
IO_STATUS_BLOCK iosb = {{0}, 0};
|
||||
FILE_PIPE_LOCAL_INFORMATION fpli = {0};
|
||||
NTSTATUS status;
|
||||
|
|
Loading…
Reference in New Issue