[Rd] Why no race condition when returning UNPROTECT-ed memory from C?

peter dalgaard pdalgd at gmail.com
Wed Apr 14 10:10:03 CEST 2010


On Apr 14, 2010, at 7:50 AM, Dominick Samperi wrote:

> Consider the C (or C++) code called from the .Call interface:
> SEXP foo() {
>  SEXP *p = PROTECT(allocVector(REALSXP, 10));
>  ...
>  UNPROTECT(1);
>  return p;
> }
> 
> Why is there no danger that the allocated memory will be garbage
> collected after the UNPROTECT, but before the return of p?
> 
> I have used code like this for some time and have never had a
> problem, but I'm not sure if/why it is guaranteed to work.

Garbage collection is only triggered by allocation. The hard bit is to remember exactly which programming constructs might allocate something, but in the above, there aren't any. You need to watch out with the unprotected return value, though: fee(foo(), fum()) is a standard bug source if fum() allocates.


-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-devel mailing list