summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2014-10-10 18:28:31 (GMT)
committerdgp <dgp@users.sourceforge.net>2014-10-10 18:28:31 (GMT)
commit6e2254e5e08ad3cb6f82cb555664905426fa7f93 (patch)
tree5a24342f39f0de5c02c0278599a04d8d500e041e
parent7f55f427fdcb97fe91f06988c6dc9e3120b11c90 (diff)
parent1159aa03c57e16b943f56f65272a590c5b1f0d50 (diff)
downloadtcl-6e2254e5e08ad3cb6f82cb555664905426fa7f93.zip
tcl-6e2254e5e08ad3cb6f82cb555664905426fa7f93.tar.gz
tcl-6e2254e5e08ad3cb6f82cb555664905426fa7f93.tar.bz2
[ed29c4da21] Merge patch from 8.5, still not a complete fix.
-rw-r--r--generic/tclIO.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index aea633c..3d36d45 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -9502,21 +9502,39 @@ DoRead(
}
/*
- * If there is not enough data in the buffers to possibly
- * complete the read, then go get more.
+ * Don't read more data if we have what we need.
*/
- if (bufPtr == NULL || BytesLeft(bufPtr) < bytesToRead) {
+ while (!bufPtr || /* We got no buffer! OR */
+ (!IsBufferFull(bufPtr) && /* Our buffer has room AND */
+ (BytesLeft(bufPtr) < bytesToRead) ) ) {
+ /* Not enough bytes in it
+ * yet to fill the dst */
+ int code;
+
moreData:
- if (GetInput(chanPtr)) {
+ code = GetInput(chanPtr);
+ bufPtr = statePtr->inQueueHead;
+
+ assert (bufPtr != NULL);
+
+ if (GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED)) {
+ /* Further reads cannot do any more */
+ break;
+ }
+
+ if (code) {
/* Read error */
UpdateInterest(chanPtr);
TclChannelRelease((Tcl_Channel)chanPtr);
return -1;
}
- bufPtr = statePtr->inQueueHead;
+
+ assert (IsBufferFull(bufPtr));
}
+ assert (bufPtr != NULL);
+
bytesRead = BytesLeft(bufPtr);
bytesWritten = bytesToRead;