From luke at stat.uiowa.edu  Fri Mar 31 17:29:24 2006
From: luke at stat.uiowa.edu (Luke Tierney)
Date: Fri, 31 Mar 2006 09:29:24 -0600 (CST)
Subject: [Rd] [R] R garbage collection
In-Reply-To: <Pine.LNX.4.64.0603310748320.32430@gannet.stats.ox.ac.uk>
References: <442C9786.4050708@yahoo.com>
	<Pine.LNX.4.64.0603310748320.32430@gannet.stats.ox.ac.uk>
Message-ID: <Pine.LNX.4.63.0603310921450.11743@nokomis.stat.uiowa.edu>

The allocations described as User-Controlled are not part of the
GC-managed heap.  The ones described as Transient happen to be but
that is not user visible; alternate implementations might insure that
they are freed as soon as the appropriate context is left.

If you are interested in managing the lifetime of heap-allocated
objects then you register roots for the GC with R_PreserveObject.

luke

On Fri, 31 Mar 2006, Prof Brian Ripley wrote:

> On Thu, 30 Mar 2006, Jeff Henrikson wrote:
>
>> r-help,
>
> [Moved to R-devel.]
>
>> The R manual lists two types of memory: transient and user-controlled.
>> If I have transient blocks reachable from the globals only by traversal
>> through user-controlled blocks, will they be correctly preserved?
>
> I don't understand your terminology, especially 'traversal'.  It is not
> normal to have either type of block reachable through R objects, and if
> you are using something like external pointers, the answer would be no.
>
>> Secondly, what are the ways to mark user controlled blocks as "roots"
>> for the garbage collector, so that transient blocks they reference stay
>> uncollected?  So far I can only deduce that as long as the answer to my
>> first question is yes, I can bind an arbitrary symbol to them in the
>> global environment.  Is this the best way?
>
> I think you are referring to blocks allocated by R_alloc.  The manual says
>
>   This memory is taken from the heap, and released at the end of the .C,
>   .Call or .External call. Users can also manage it, by noting the current
>   position with a call to vmaxget and clearing memory allocated
>   subsequently by a call to vmaxset. This is only recommended for experts.
>
> If you want to allocate storage as part of an R object, this is not the
> best way to do it (allocVector etc are).  It is a side-effect of the
> current implementation that memory allocated by R_alloc which is made part
> of an object will be protected for the lifetime of that object, but this
> is not documented and should not be relied on.  (I am thinking if for
> example a block is made into a CHARSXP 'by hand', but the documented route
> is mkChar which makes a copy.)
>
>> Jeff Henrikson
>>
>> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
> Please do, including the question `which list': this clearly belongs on
> R-devel.
>
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] [R] R garbage collection
Luke Tierney