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:
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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue