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. |