* fhandler.cc (fhandler_base_overlapped::close): Finish any pending I/O before

closing.
(fhandler_base_overlapped::wait_overlapped): Defensively zero bytes read.  Add
more info to debugging output.
This commit is contained in:
Christopher Faylor 2011-02-21 03:18:30 +00:00
parent 734e1c50ff
commit 05901e6aee
2 changed files with 15 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2011-02-20 Christopher Faylor <me+cygwin@cgf.cx>
* fhandler.cc (fhandler_base_overlapped::close): Finish any pending I/O
before closing.
(fhandler_base_overlapped::wait_overlapped): Defensively zero bytes
read. Add more info to debugging output.
2011-02-18 Christopher Faylor <me+cygwin@cgf.cx> 2011-02-18 Christopher Faylor <me+cygwin@cgf.cx>
* dcrt0.cc (dll_crt0_1): Add a CYGHEAP_DEBUG conditional for debugging * dcrt0.cc (dll_crt0_1): Add a CYGHEAP_DEBUG conditional for debugging

View File

@ -1046,6 +1046,12 @@ fhandler_base::close ()
int int
fhandler_base_overlapped::close () fhandler_base_overlapped::close ()
{ {
if (is_nonblocking () && io_pending)
{
DWORD bytes;
set_nonblocking (false);
wait_overlapped (1, !!(get_access () & GENERIC_WRITE), &bytes);
}
destroy_overlapped (); destroy_overlapped ();
return fhandler_base::close (); return fhandler_base::close ();
} }
@ -1749,6 +1755,7 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte
DWORD wfres = WaitForMultipleObjects (n, w4, false, INFINITE); DWORD wfres = WaitForMultipleObjects (n, w4, false, INFINITE);
if (wfres != WAIT_OBJECT_0) if (wfres != WAIT_OBJECT_0)
CancelIo (h); CancelIo (h);
*bytes = 0;
BOOL wores = GetOverlappedResult (h, get_overlapped (), bytes, false); BOOL wores = GetOverlappedResult (h, get_overlapped (), bytes, false);
bool signalled = !wores && (wfres == WAIT_OBJECT_0 + 1); bool signalled = !wores && (wfres == WAIT_OBJECT_0 + 1);
if (signalled) if (signalled)
@ -1762,7 +1769,7 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte
else if (!wores) else if (!wores)
{ {
err = GetLastError (); err = GetLastError ();
debug_printf ("GetOverLappedResult failed"); debug_printf ("GetOverLappedResult failed, bytes %u", *bytes);
} }
else else
{ {