From Martin Maechler <maechler@stat.math.ethz.ch>  Thu Sep  7 17:32:59 2000
From: Martin Maechler <maechler@stat.math.ethz.ch> (Martin Maechler)
Date: Thu, 7 Sep 2000 18:32:59 +0200 (CEST)
Subject: [Rd] Calloc() & Free() in different .C(.) calls --> not usable ?
Message-ID: <14775.49979.313017.584547@gargle.gargle.HOWL>

       [sending this to R-devel, since it may be of general interest and 
        could possibly lead to better instructions in the "R-exts" manual]

Is this another case where only .Call() or .External() [or a fudge factor]
solve my problem? 

Following situation: 
 I use dyn.loaded C code to compute a recursive tree structure from my data.
 Beforehand I don't know how big the tree will be, but I want the tree
 (as integer array in my case) be passed back to R.

 Current solution [simplified!]:

  
 ## First I fit the tree to my Data, all in C, but only return the *size*
 ## I'll need to store that tree in R

	 size <-      .C("fittree", data, ..., res = integer(1))$res

 ## Now that I know its size, I can get it into R :

	 tree.in.R <- .C("gettree", size, res = integer(size))$res

 where in the C code, I have a
 global 
	static *tree_struct my_tree;
 and in C's fittree(), I use 
	my_tree = Calloc(1, tree_struct); 
 for building the tree, which is 
 then accessed by gettree(), which ends in
	Free(my_tree);

All well, BUT: 
    problem is that memory just builds up and is not freed at all.

>From a (more private) E-mail of Prof Brian Ripley, I read (maybe wrongly?)
that this seems to be ``common'':

    BDR> and the way that most mallocs work is to use sbrk to raise or lower
    BDR> the brk, that is the size of the data space. 
    BDR> They only reduce it when the data space is sufficiently unfragmented. 
	 --------------------------------------------------------------------
which may be my case : "Free(my_tree)" doesn't really free the
memory [according to my tests, looking at Unix' "ps .."].

Solutions (yes, one of them is  ``use .Call() !'') ??

Martin Maechler <maechler@stat.math.ethz.ch>	http://stat.ethz.ch/~maechler/
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] Calloc() & Free() in different .C(.) calls --> not usable ?
Martin Maechler