diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | generic/tclIO.c | 24 |
2 files changed, 28 insertions, 7 deletions
@@ -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; |