diff options
| author | dgp <dgp@users.sourceforge.net> | 2014-04-29 17:40:15 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2014-04-29 17:40:15 (GMT) |
| commit | 210aa9605a79e6779e1bdfa87435fc3cc504d7de (patch) | |
| tree | 33786fb99afd0004f63f6cd467cf9fe61ee87918 /generic/tclIO.c | |
| parent | 35a41cd0d6b0d145890a13973a3a6875b294115b (diff) | |
| download | tcl-210aa9605a79e6779e1bdfa87435fc3cc504d7de.zip tcl-210aa9605a79e6779e1bdfa87435fc3cc504d7de.tar.gz tcl-210aa9605a79e6779e1bdfa87435fc3cc504d7de.tar.bz2 | |
Make sure no shared ChannelBuffers get recycled.
Diffstat (limited to 'generic/tclIO.c')
| -rw-r--r-- | generic/tclIO.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 08d0d93..6831c47 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -164,6 +164,7 @@ typedef struct CloseCallback { static ChannelBuffer * AllocChannelBuffer(int length); static void PreserveChannelBuffer(ChannelBuffer *bufPtr); static void ReleaseChannelBuffer(ChannelBuffer *bufPtr); +static int IsShared(ChannelBuffer *bufPtr); static void ChannelTimerProc(ClientData clientData); static int CheckChannelErrors(ChannelState *statePtr, int direction); @@ -2239,6 +2240,13 @@ ReleaseChannelBuffer( } ckfree((char *) bufPtr); } + +static int +IsShared( + ChannelBuffer *bufPtr) +{ + return bufPtr->refCount > 1; +} /* *---------------------------------------------------------------------- @@ -2269,6 +2277,9 @@ RecycleBuffer( /* * Do we have to free the buffer to the OS? */ + if (IsShared(bufPtr)) { + mustDiscard = 1; + } if (mustDiscard) { ReleaseChannelBuffer(bufPtr); |
