summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandreas_kupries <akupries@shaw.ca>2009-10-23 19:08:44 (GMT)
committerandreas_kupries <akupries@shaw.ca>2009-10-23 19:08:44 (GMT)
commit6e5f5cf6aa1b14b180e83744d92fa4639c49a587 (patch)
tree2109da7eb4d642c73dcff2082b77795c03f0711a
parente6bbad298d8df84ba97e6f019d01c1956165c915 (diff)
downloadtcl-6e5f5cf6aa1b14b180e83744d92fa4639c49a587.zip
tcl-6e5f5cf6aa1b14b180e83744d92fa4639c49a587.tar.gz
tcl-6e5f5cf6aa1b14b180e83744d92fa4639c49a587.tar.bz2
* generic/tclIO.c (FlushChannel): Skip OutputProc for low-level
0-length writes. When closing pipes which have already been closed not skipping leads to spurious SIG_PIPE signals. Reported by Mikhail Teterin <mi+thun@aldan.algebra.com>.
-rw-r--r--ChangeLog7
-rw-r--r--generic/tclIO.c8
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b788e78..5316163 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-10-23 Andreas Kupries <andreask@activestate.com>
+
+ * generic/tclIO.c (FlushChannel): Skip OutputProc for low-level
+ 0-length writes. When closing pipes which have already been closed
+ not skipping leads to spurious SIG_PIPE signals. Reported by
+ Mikhail Teterin <mi+thun@aldan.algebra.com>.
+
2009-10-21 Donal K. Fellows <dkf@users.sf.net>
* generic/tclPosixStr.c: [Bug 2882561]: Work around oddity on Haiku OS
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 8e00054..11cb205 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.61.2.32 2008/12/01 21:48:01 dgp Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.61.2.33 2009/10/23 19:08:45 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -2131,9 +2131,13 @@ FlushChannel(interp, chanPtr, calledFromAsyncFlush)
*/
toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
- written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
+ if (toWrite == 0) {
+ written = 0;
+ } else {
+ written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
bufPtr->buf + bufPtr->nextRemoved, toWrite,
&errorCode);
+ }
/*
* If the write failed completely attempt to start the asynchronous