Tcl Source Code

View Ticket
Login
Ticket UUID: 1348775
Title: varTraces leak when variable is unset
Type: Bug Version: obsolete: 8.4.11
Submitter: msofer Created on: 2005-11-05 02:07:54
Subsystem: 46. Traces Assigned To: dkf
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2005-11-08 21:56:27
Resolution: Fixed Closed By: dkf
    Closed on: 2005-11-08 14:56:22
Description:
The new test trace-8.9 shows an 18-byte leak:
        set end [getbytes]
        for {set i 0} {$i < 5} {incr i} {
            set apa {a 1 b 2}
            set bepa [lrange $apa 0 end]
            trace add variable bepa write {error hej}
            catch {set bepa a}
            unset bepa
            set tmp $end
            set end [getbytes]
        }
        expr {$end - $tmp}

This supercedes #1342858, which detected the same leak
but blamed it on [dict].
User Comments: dkf added on 2005-11-08 21:56:27:

File Added - 155453: trace-8.5.diff

dkf added on 2005-11-08 21:56:20:
Logged In: YES 
user_id=79902

fixed 8.4 branch with your patch and HEAD with attached patch.

dkf added on 2005-11-08 17:44:05:
Logged In: YES 
user_id=79902

Might be cleaner to introduce a new private function
(perhaps called TclTraceVarEx) that lets the caller supply
the VarTrace with the traceProc, clientData and flags fields
already filled in. That would, in turn, allow the lookup
code to be handled far more neatly (i.e. by not inlining it
all in the [trace * variable] subcommand implementation).

The general strategy (using a single alloc instead of a
pair) should work well though, given that we cannot change
the API.

Still thinking about this...

msofer added on 2005-11-08 04:32:58:

File Deleted - 155356: 



File Added - 155357: trace-8.4.patch

msofer added on 2005-11-08 04:29:34:

File Deleted - 155347: 



File Added - 155356: trace-8.4.patch

Logged In: YES 
user_id=148712

Patch replaced with a slightly-less-icky one (thanks kevin
and joe).

msofer added on 2005-11-08 03:24:27:

File Added - 155347: trace-8.4.patch

msofer added on 2005-11-08 03:24:26:
Logged In: YES 
user_id=148712

The attached patch solves the issue for 8.4, in an inelegant
but effective and safe (?) way - assigning to dkf for a
second opinion on this.

msofer added on 2005-11-07 19:34:21:
Logged In: YES 
user_id=148712

Specifically: the code for [unset] does Tcl_EventuallyFree
the VarTrace, but does not free the contents of its
clientData field. 

Look for a q&d solution in 8-4, and a redesign for 8.5 (see
also #1056134) maybe involving api changes: Tcl_TraceVar
should take also a deletion callback as argument.

msofer added on 2005-11-07 17:46:36:
Logged In: YES 
user_id=148712

Test trace-8.9 deleted, trace-13.2-4 added to HEAD and
8-4-branch.

When a traced variable is unset, the TraceVarInfo
(clientData in the VarTrace struct) is leaked. This should
be fixed directly in 8.4, and possibly together with
#1056134 in HEAD.

Attachments: