summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorferrieux <ferrieux@users.sourceforge.net>2010-12-10 17:00:12 (GMT)
committerferrieux <ferrieux@users.sourceforge.net>2010-12-10 17:00:12 (GMT)
commitf2f87ec0246421e1760b52b1474c93a231edac92 (patch)
tree142ba2e59b9f44e8c70c68d74aafb1712391f1d1 /generic/tclIO.c
parent96632083236aaeac42d4555a1f9cc187d04da271 (diff)
downloadtcl-f2f87ec0246421e1760b52b1474c93a231edac92.zip
tcl-f2f87ec0246421e1760b52b1474c93a231edac92.tar.gz
tcl-f2f87ec0246421e1760b52b1474c93a231edac92.tar.bz2
Make sure [fcopy -size ... -command ...] always calls the callback asynchronously, even for size zero.
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 0ed57d0..adc630f 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclIO.c,v 1.175 2010/03/20 17:49:15 dkf Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.176 2010/12/10 17:00:12 ferrieux Exp $
*/
#include "tclInt.h"
@@ -8915,6 +8915,33 @@ Tcl_FileEventObjCmd(
/*
*----------------------------------------------------------------------
*
+ * ZeroTransferTimerProc --
+ *
+ * Timer handler scheduled by TclCopyChannel so that -command is
+ * called asynchronously even when -size is 0.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Calls CopyData for -command invocation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ZeroTransferTimerProc(
+ ClientData clientData)
+{
+ /* calling CopyData with mask==0 still implies immediate invocation of the
+ * -command callback, and completion of the fcopy.
+ */
+ CopyData(clientData, 0);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* TclCopyChannel --
*
* This routine copies data from one channel to another, either
@@ -9033,6 +9060,16 @@ TclCopyChannel(
outStatePtr->csPtrW = csPtr;
/*
+ * Special handling of -size 0 async transfers, so that the -command is
+ * still called asynchronously.
+ */
+
+ if ((nonBlocking == CHANNEL_NONBLOCKING) && (toRead == 0)) {
+ Tcl_CreateTimerHandler(0, ZeroTransferTimerProc, csPtr);
+ return 0;
+ }
+
+ /*
* Start copying data between the channels.
*/