[GRASS5] NVIZ and threaded TCL 8.4 working

Cedric Shock cedricgrass at shockfamily.net
Tue Mar 14 21:03:47 EST 2006


Hi,

The subject is indeed correct:

http://www.shockfamily.net/cedric/grass/nviztcl84threaded.png

My tcl and tk 8.4 binaries are Ubuntu, which are probably pretty similar to 
debian's.

Many of the nviz c source files call Tcl_Merge to make return strings, and 
assign them to interp->result where interp is the TCL interpreter like this:

interp->result = Tcl_Merge(3, list);

Then they set the freeProc ("function" to call to free the memory) to be free 
(glibc). Tcl_Merge allocates its memory with Tcl_Alloc, not with malloc. 
Before 8.4 Tcl_Alloc just happened to be malloc, but it's not anymore. The 
correct thing to do is to set the freeProc to be TCL_DYNAMIC, which will be 
TCL's opposite of Tcl_Alloc, like this:

interp->freeProc = TCL_DYNAMIC;

I replaced all of the references to glibc free as freeProc (only related to 
results that use Tcl_Alloc, which turns out to be all of them) with 
TCL_DYNAMIC. I also found one case of sprintf-ing to interp->result without 
allocating memory and replaced it with the appropriate (Tcl_SetResult?) code.

I am not including a patch, as the number of differences between my current 
codebase and CVS is ridiculous to try to deal with by editing cvs diff -u -p 
patch files by hand.

--Cedric Shock




More information about the grass-dev mailing list