From 513d743d0f05094ff7985f9840cc5db7f4bb3955 Mon Sep 17 00:00:00 2001 From: andreas_kupries Date: Wed, 7 Nov 2001 04:47:54 +0000 Subject: See ChangeLog --- ChangeLog | 11 +++++++++++ generic/tclIO.c | 24 +++++++++++++++++------- 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 + + * generic/tclIO.c (ReadChars): Fixed bug #478856 reported by + Stuart Cassoff . 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 * 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; -- cgit v0.12