summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--generic/tclIO.c24
2 files changed, 28 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 49a9237..caf3938 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2001-11-06 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+
+ * generic/tclIO.c (ReadChars): Fixed bug #478856 reported by
+ Stuart Cassoff <stwo@users.sourceforge.net>. The bug caused loss
+ of fileevents when [read]ing less data from the channel than
+ buffered. Due to an empty input buffer the flag
+ CHANNEL_NEED_MORE_DATA was set but never reset, causing the I/O
+ system to wait for more data instead of using a timer to
+ synthesize fileevents and to flush the pending data out of the
+ buffers.
+
2001-11-06 David Gravereaux <davygrvy@pobox.com>
* win/rules.vc (new):
diff --git a/generic/tclIO.c b/generic/tclIO.c
index a5979e2..982d6ff 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.40 2001/10/16 05:31:18 dgp Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.41 2001/11/07 04:47:54 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -4642,13 +4642,23 @@ ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr)
nextPtr = bufPtr->nextPtr;
if (nextPtr == NULL) {
- /*
- * There isn't enough data in the buffers to complete the next
- * character, so we need to wait for more data before the next
- * file event can be delivered.
- */
+ if (srcLen > 0) {
+ /*
+ * There isn't enough data in the buffers to complete the next
+ * character, so we need to wait for more data before the next
+ * file event can be delivered.
+ *
+ * SF #478856.
+ *
+ * The exception to this is if the input buffer was
+ * completely empty before we tried to convert its
+ * contents. Nothing in, nothing out, and no incomplete
+ * character data. The conversion before the current one
+ * was complete.
+ */
- statePtr->flags |= CHANNEL_NEED_MORE_DATA;
+ statePtr->flags |= CHANNEL_NEED_MORE_DATA;
+ }
return -1;
}
nextPtr->nextRemoved -= srcLen;