Hello,

However, I do need some sort of protection.
(pseudo code)

SEXP a = Rf_allocVector(STRSXP,....)
protect a
for i = 1 to length of vector
  SET_STRING_ELT(a,i, Rf_mkChar(...))
end
unprotect a
return a

I _need _that protect because in the for loop i also call some R functions
and need the object 'a' to be protected.

However, as I pointed out,
1. I replaced protect by PreserveObject
2. remove the unprotect word

I can guarantee, that some time later ReleaseObject will be called on 'a'.

So ultimately, whether this good design or not, the question remains,
given that 'a' is the in precious list, and 'a' is assigned to 'v', if
ReleaseObject is called on 'a', will 'a 'still be assigned to 'v' and
therefore not get GC'd.

In rudimentary tests, it doesn't appear to cause seg faults. But is it safe?

Cheers
Thanks
Saptarshi




On Thu, Mar 6, 2014 at 2:48 PM, Gabriel Becker <gmbec...@ucdavis.edu> wrote:

> Saptarshi,
>
> R_PreserveObject and R_ReleaseObject are, as far as I know, intended for
> the rare situations where you need to maintain a SEXP in C that is not
> pointed to by any R level symbols, and across e.g. .Calls.
>
> If you are returning an object to R ("v" in this case) and intend to do
> .Call("cfunc2", v) later, there is no benefit at all to having called
> R_PreserveObject on it. The only case where your object would lose
> protection (v and all other R symbols being rm'd/going out of scope) would
> also cause to to lose your only reference to the SEXP, so by R_Preserve'ing
> all you will have done is create an unreachable protected pointer.
>
> If you are keeping a static pointer to the SEXP down in C code that R
> can't see, then R_PreserveObject would be appropriate, but the situations
> where doing that is a good idea are rare (though they do exist).
>
> HTH,
> ~G
>
>
>
>
> On Thu, Mar 6, 2014 at 2:32 PM, Saptarshi Guha 
> <saptarshi.g...@gmail.com>wrote:
>
>> Hello,
>>
>> This  is a question that probably reveals my lack of understanding.
>> In a C function (call it cfunc), i created a SEXP, called S, and then
>> called R_PreserveObject on S.
>>
>> I returned the SEXP to the calling R function (call it rfunc). Note, I
>> didn't call
>> R_ReleaseObject on S.
>>
>> v <- .Call("cfunc")
>>
>> So, are the following  statements correct
>>
>> 1.  S is 'doubly' protected from the GC by  being associated both with 'v'
>> and because it has been added to the precious list (via a call to
>> R_PreserveObject without ReleaseObject being called)
>>
>> 2. I have another C function called cfunc2. In cfunc2, I call
>> R_ReleaseObject on S.  S , however, is still protected from the GC,
>> because
>> it is associated with 'v'
>>
>> Is (1) and (2) correct?
>>
>> I have not used R_protect/unprotect, because if I return from cfunc
>> without
>> the equivalent number of unprotects, i get 'unbalanced stack' warnings.
>> I'd
>> rather not have to worry about that because i intend to balance it later.
>>
>> Regards
>> Saptarshi
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
>
> --
> Gabriel Becker
> Graduate Student
> Statistics Department
> University of California, Davis
>

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to