From: SourceForge.net <no...@so...> - 2009-10-08 13:26:04
|
Bugs item #2874678, was opened at 2009-10-08 14:35 Message generated for change (Comment added) made by wastl-nagel You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2874678&group_id=10894 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: 15. Dict Object Group: current: 8.5.7 Status: Open Resolution: None Priority: 5 Private: No Submitted By: Sebastian Nagel (wastl-nagel) Assigned to: Donal K. Fellows (dkf) Summary: dict incr leaks Initial Comment: If a dict is created and filled via "dict incr" with a bigger set of keys it seems to leak. If the dict is destroyed (unset or overwritten) a lot of memory still keeps allocated. The following code consumes approx. 500MB memory on my machine (Linux, 64-bit): set chars {a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9} for {set i 0} {$i < 1000} {incr i} { append prefix [lindex $chars [expr int([tcl::mathfunc::rand]*62)]] set dictionary [dict create] foreach char $chars { foreach c $chars { dict incr dictionary $prefix$char$c $i } } } I've tested Tcl 8.5.2 (OpenSuSE 11.0, x86_64), 8.5.7, 8.6b1 (both built from source), all three leak, cf. attached valgrind log files for same code but only 100 cycles. For 8.5.2 TclBN_mp_init_size according to valgrind seems to be reason. % uname -mrvs Linux 2.6.25.20-0.5-default #1 SMP 2009-08-14 01:48:11 +0200 x86_64 ---------------------------------------------------------------------- >Comment By: Sebastian Nagel (wastl-nagel) Date: 2009-10-08 15:26 Message: May the patch below fix the problem? --- ./generic/tclDictObj.c~ 2009-01-06 17:07:17.000000000 +0100 +++ ./generic/tclDictObj.c 2009-10-08 15:00:29.000000000 +0200 @@ -2148,6 +2148,7 @@ mp_int increment; code = Tcl_GetBignumFromObj(interp, objv[3], &increment); + mp_clear(&increment); if (code != TCL_OK) { Tcl_AddErrorInfo(interp, "\n (reading increment)"); } else { ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2874678&group_id=10894 |