summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/fhandler.cc15
-rw-r--r--winsup/cygwin/syscalls.cc2
3 files changed, 19 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index b29969747..3b2e1c7f0 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,13 @@
+2012-01-31 Christopher Faylor <me.cygwin2012@cgf.cx>
+
+ * syscalls.cc (dup3): Fix debug typo.
+
+ * fhandler.cc (flush_async_io): Assume only called for writer. Call
+ GetOverlappedResult directly rather than kluding call to
+ has_ongoing_io.
+ (fhandler_base_overlapped::close): Only start flush thread when closing
+ write handle. Only cancel I/O when reading.
+
2012-01-28 Corinna Vinschen <corinna@vinschen.de>
* cygwin.din: Fix order (DATA first).
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 9c229933e..0997c9abb 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -1156,11 +1156,10 @@ DWORD WINAPI
flush_async_io (void *arg)
{
fhandler_base_overlapped *fh = (fhandler_base_overlapped *) arg;
- debug_only_printf ("waiting for %s I/O for %s",
- (fh->get_access () & GENERIC_WRITE) ? "write" : "read",
- fh->get_name ());
- SetEvent (fh->get_overlapped ()->hEvent); /* force has_ongoing_io to block */
- bool res = fh->has_ongoing_io ();
+ debug_only_printf ("waiting for write I/O for %s", fh->get_name ());
+ DWORD nbytes;
+ bool res = GetOverlappedResult (fh->get_output_handle (),
+ fh->get_overlapped (), &nbytes, true);
debug_printf ("finished waiting for I/O from %s, res %d", fh->get_name (),
res);
fh->close ();
@@ -1210,9 +1209,10 @@ int
fhandler_base_overlapped::close ()
{
int res;
+ int writer = (get_access () & GENERIC_WRITE);
/* Need to treat non-blocking I/O specially because Windows appears to
be brain-dead */
- if (is_nonblocking () && has_ongoing_io ())
+ if (writer && is_nonblocking () && has_ongoing_io ())
{
clone (HEAP_3_FHANDLER)->check_later ();
res = 0;
@@ -1221,7 +1221,8 @@ fhandler_base_overlapped::close ()
{
/* Cancelling seems to be necessary for cases where a reader is
still executing when a signal handler performs a close. */
- CancelIo (get_io_handle ());
+ if (!writer)
+ CancelIo (get_io_handle ());
destroy_overlapped ();
res = fhandler_base::close ();
}
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 384319231..4ff64a3e3 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -163,7 +163,7 @@ dup3 (int oldfd, int newfd, int flags)
}
else
res = cygheap->fdtab.dup3 (oldfd, newfd, flags);
- syscall_printf ("%R = dup2(%d, %d, %p)", res, oldfd, newfd, flags);
+ syscall_printf ("%R = dup3(%d, %d, %p)", res, oldfd, newfd, flags);
return res;
}