diff options
Diffstat (limited to 'winsup/cygwin/fhandler.cc')
-rw-r--r-- | winsup/cygwin/fhandler.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index d0210f83b..a22fe2496 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1982,7 +1982,11 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte } if (res == overlapped_success) - debug_printf ("normal %s, %u bytes", writing ? "write" : "read", *bytes); + { + debug_printf ("normal %s, %u bytes ispipe() %d", writing ? "write" : "read", *bytes, ispipe ()); + if (*bytes == 0 && !writing && ispipe ()) + res = overlapped_nullread; + } else if (res == overlapped_nonblocking_no_data) { *bytes = (DWORD) -1; @@ -2020,6 +2024,9 @@ fhandler_base_overlapped::raw_read (void *ptr, size_t& len) get_overlapped ()); switch (wait_overlapped (res, false, &nbytes, is_nonblocking ())) { + case overlapped_nullread: + keep_looping = true; + break; default: /* Added to quiet gcc */ case overlapped_success: case overlapped_error: @@ -2076,6 +2083,7 @@ fhandler_base_overlapped::raw_write (const void *ptr, size_t len) case overlapped_error: len = 0; /* terminate loop */ case overlapped_unknown: + case overlapped_nullread: case overlapped_nonblocking_no_data: break; } |