[Rd] PROTECT and OCaml GC.
Guillaume Yziquel
guillaume.yziquel at citycable.ch
Sun Nov 29 00:50:52 CET 2009
Hello.
In the writing of my OCaml-R binding, I'm sort of confused when it comes
to the use of the PROTECT and UNPROTECT macros.
Basically, I have C stub functions that are in charge of calling R for
everything. Here's a simple example:
> CAMLprim value r_findvar (value symbol) {
> /* The findVar function is defined in envir.c. It looks up a symbol
> in an environment. */
> CAMLparam1(symbol);
> CAMLreturn(Val_sexp(findVar(Sexp_val(symbol), R_GlobalEnv)));
> }
This simply makes a call to findVar and returns the value to Objective
Caml. It seems to me that I should be writing:
> CAMLprim value r_findvar (value symbol) {
> /* The findVar function is defined in envir.c. It looks up a symbol
> in an environment. */
> CAMLparam1(symbol);
> SEXP e;
> PROTECT(e = findVar(Sexp_val(symbol), R_GlobalEnv));
> CAMLreturn(Val_sexp(e));
> }
However, as OCaml has its own GC, I'm wondering where to put UNPROTECT.
Many codes I see on the net UNPROTECT the value just after it has been
protected. The rationale, it seems, is that the value is at risk only a
short timeframe after it has been created.
This seems rather curious to me, and I'm wondering if I should not
rather UNPROTECT the value at the moment OCaml's GC says the value is
not needed anymore.
Please tell me which option I should go forward with.
(I'll assume for now that OCaml is monothreaded. I do not believe that R
itself is thread-safe, so I'll first handle this monothreaded case.)
All the best,
--
Guillaume Yziquel
http://yziquel.homelinux.org/
More information about the R-devel
mailing list