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
|
static int
|
||||||
pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
|
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};
|
IO_STATUS_BLOCK iosb = {{0}, 0};
|
||||||
FILE_PIPE_LOCAL_INFORMATION fpli = {0};
|
FILE_PIPE_LOCAL_INFORMATION fpli = {0};
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
|
Loading…
Reference in New Issue