summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2014-05-08 03:28:56 (GMT)
committerdgp <dgp@users.sourceforge.net>2014-05-08 03:28:56 (GMT)
commit311f44633e3dab963b7705cd04ffa3a4b6c4dcce (patch)
tree691948500985fc43c2eee0e90a31e76c654c8e18 /generic/tclIO.c
parent3f767c15a3a870d5692ae43cd6151fb86ffa2bf3 (diff)
parent5e1038193c820c5a5ae7b27886d8d3100e18ea49 (diff)
downloadtcl-311f44633e3dab963b7705cd04ffa3a4b6c4dcce.zip
tcl-311f44633e3dab963b7705cd04ffa3a4b6c4dcce.tar.gz
tcl-311f44633e3dab963b7705cd04ffa3a4b6c4dcce.tar.bz2
merge trunk
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index d5d4086..c4d9171 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -2312,6 +2312,9 @@ static void
PreserveChannelBuffer(
ChannelBuffer *bufPtr)
{
+ if (bufPtr->refCount == 0) {
+ Tcl_Panic("Reuse of ChannelBuffer!");
+ }
bufPtr->refCount++;
}
@@ -2610,6 +2613,7 @@ FlushChannel(
if (errorCode == EINTR) {
errorCode = 0;
+ ReleaseChannelBuffer(bufPtr);
continue;
}
@@ -2631,6 +2635,7 @@ FlushChannel(
UpdateInterest(chanPtr);
}
errorCode = 0;
+ ReleaseChannelBuffer(bufPtr);
break;
}
@@ -2692,6 +2697,7 @@ FlushChannel(
*/
DiscardOutputQueued(statePtr);
+ ReleaseChannelBuffer(bufPtr);
continue;
} else {
wroteSome = 1;
@@ -2711,8 +2717,11 @@ FlushChannel(
statePtr->outQueueTail = NULL;
}
RecycleBuffer(statePtr, bufPtr, 0);
+ bufPtr = NULL;
+ }
+ if (bufPtr) {
+ ReleaseChannelBuffer(bufPtr);
}
- ReleaseChannelBuffer(bufPtr);
} /* Closes "while (1)". */
/*
@@ -4026,6 +4035,7 @@ WillRead(
{
if (chanPtr->typePtr == NULL) {
/* Prevent read attempts on a closed channel */
+ DiscardInputQueued(chanPtr->state, 0);
Tcl_SetErrno(EINVAL);
return -1;
}
@@ -4204,6 +4214,7 @@ Write(
if (IsBufferFull(bufPtr)) {
if (FlushChannel(NULL, chanPtr, 0) != 0) {
+ ReleaseChannelBuffer(bufPtr);
return -1;
}
flushed += statePtr->bufSize;