In general, once an Rcpp API gives you a SEXP, it is unprotected and
the onus is on your to manage its protection.

In your code:

            SEXP intSexp = call1.eval();
            Language call2("levels",facSexp);
            SEXP levelsSexp = call2.eval();
            vals = as< std::vector<int> >(intSexp); //here be errors
with gctorture

Those SEXPs are unprotected, so would be eligible for garbage collection.

You could instead use Shield<SEXP> or RObject to act as thin wrappers
over a SEXP which needs protection from the garbage collector.

Best,
Kevin

On Wed, Jan 9, 2019 at 4:23 PM Fellows, Ian <ian.fell...@stat.ucla.edu> wrote:
>
>
> Thank you Bill,
>
> I have tried gctorture, and low and behold I got an error in some of my code 
> (Yay!). I was able to pin the gctorture error to something small and 
> reproducible. It turns out in a one place I created temporary SEXP variables 
> (see the example below), and I guess these were not protected automatically 
> by Rcpp. I’ve changed these to RObject objects and things seem to work fine, 
> though I’ll have to do a bunch more builds to be sure.
>
> This has gotten me a little worried about other places in the code where 
> SEXPs pop up. I’ve now limited the use of SEXPs to function parameters and 
> return values. This is mostly for transport of objects to and from R. Let’s 
> say I have a method like
>
> SEXP afunc(){
>   List lis;
>   // add things to list
>   return lis;
> }
>
> My understanding is that afunc safe to use in a module. Is it also safe to 
> call from other C++ code, or is lis open to garbage collection?
>
>
>
> Thanks,
> Ian
>
>
>
> ---------
>
> library(inline)
> library(Rcpp)
> inc <- '
> using namespace Rcpp;
> class TestObj {
> public:
>   TestObj(int i){}
>
>   void set(SEXP robj){
>         try{
>             Language call("as.factor",robj);
>             RObject facSexp = call.eval();
>             Language call1("as.integer",facSexp);
>             SEXP intSexp = call1.eval();
>             Language call2("levels",facSexp);
>             SEXP levelsSexp = call2.eval();
>             vals = as< std::vector<int> >(intSexp); //here be errors with 
> gctorture
>         } catch(std::exception &ex) {
>             forward_exception_to_r(ex);
>         } catch(...){
>             ::Rf_error("error, invalid object addDiscreteVariableR");
>         }
>
>   }
>   std::vector<int> vals;
> };
> RCPP_MODULE(mod) {
> class_<TestObj>( "TestObj" )
> .constructor<int>()
> .method( "set", &TestObj::set )
> ;
> }
> '
> fx <- cxxfunction(signature(), plugin="Rcpp", include=inc)
> mod <- Module("mod", getDynLib(fx))
> obj <- new(mod$TestObj, 1L)
> vals <- 1:4
> gc()
> gctorture(T)
> obj$set(vals)
> # Error in obj$set(vals) :
> #   Not compatible with requested type: [type=list; target=integer].
>
> --------
>
>
>
>
>
> On January 8, 2019 at 2:35:30 PM, William Dunlap 
> (wdun...@tibco.com(mailto:wdun...@tibco.com)) wrote:
>
> > > --- re-building ‘lolog-ergm.Rmd’ using rmarkdown
> > > Quitting from lines 69-75 (lolog-ergm.Rmd)
> > > Error: processing vignette 'lolog-ergm.Rmd' failed with diagnostics:
> > > unimplemented type (28) in 'duplicate'
> >
> > I don't believe there is a type (*SXP) 28 in R. This could be due to memory 
> > misuse. Have you tried running the R code in lolog-ergm.Rmd (and your unit 
> > tests) in R
> > after setting gctorture(TRUE)?
> >
> > Bill Dunlap
> > TIBCO Software
> > wdunlap tibco.com(http://tibco.com)
> >
> > On Tue, Jan 8, 2019 at 1:31 PM Fellows, Ian wrote:
> > >
> > > Hi All,
> > >
> > > I have a package ( https://github.com/statnet/lolog | 
> > > https://cran.r-project.org/web/packages/lolog/index.html ) that makes 
> > > extensive use of Rcpp modules and passes module objects up and down 
> > > between R and C++ regularly. I’ve used the package extensively in large 
> > > simulation studies, and analyses where it has been stable.
> > >
> > > However, I have become aware of an intermittent failure to re-build the 
> > > vignettes during R CMD check. I’ve only ever encountered the issue during 
> > > check. Every once in a while I get WARNINGS like the following:
> > >
> > >
> > > -------
> > >
> > > * checking re-building of vignette outputs ... WARNING
> > > Error(s) in re-building vignettes:
> > > ...
> > > --- re-building ‘lolog-ergm.Rmd’ using rmarkdown
> > > Quitting from lines 69-75 (lolog-ergm.Rmd)
> > > Error: processing vignette 'lolog-ergm.Rmd' failed with diagnostics:
> > > unimplemented type (28) in 'duplicate'
> > >
> > > --- failed re-building ‘lolog-ergm.Rmd’
> > >
> > > --- re-building ‘lolog-introduction.Rmd’ using rmarkdown
> > > --- finished re-building ‘lolog-introduction.Rmd’
> > >
> > > SUMMARY: processing the following file failed:
> > > ‘lolog-ergm.Rmd’
> > >
> > > Error: Vignette re-building failed.
> > > Execution halted
> > >
> > > -------
> > >
> > > or
> > >
> > > -------
> > >
> > > * checking re-building of vignette outputs ... [336s/452s] WARNING
> > > Error(s) in re-building vignettes:
> > > ...
> > > --- re-building ‘lolog-ergm.Rmd’ using rmarkdown
> > > --- finished re-building ‘lolog-ergm.Rmd’
> > >
> > > --- re-building ‘lolog-introduction.Rmd’ using rmarkdown
> > > Quitting from lines 355-381 (lolog-introduction.Rmd)
> > > Error: processing vignette 'lolog-introduction.Rmd' failed with 
> > > diagnostics:
> > > cannot coerce type 'environment' to vector of type 'any'
> > > --- failed re-building ‘lolog-introduction.Rmd’
> > >
> > > SUMMARY: processing the following file failed:
> > > ‘lolog-introduction.Rmd’
> > >
> > > Error: Vignette re-building failed.
> > > Execution halted
> > >
> > > -------
> > >
> > >
> > > I’ve attempted to isolate the problem to something of a smaller but have 
> > > thus far been unsuccessful. Since this only happens occasionally, I 
> > > thought it might have something to do with how I’m passing objects up and 
> > > down ( see for example: 
> > > https://github.com/statnet/lolog/blob/master/inst/include/Model.h#L89 and 
> > > https://github.com/statnet/lolog/blob/master/inst/include/util.h#L29 ), 
> > > but that is just a shot in the dark.
> > >
> > > Does anyone have any insight as to how i might be able to better debug 
> > > this or intuitions about what could be the cause? Is it possible to get a 
> > > stack trace when rebuilding the vignettes?
> > >
> > > My apologies for the lack of a simple reproducible example.
> > >
> > > Sincerely,
> > > Ian Fellows
> > >
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Rcpp-devel mailing list
> > > Rcpp-devel@lists.r-forge.r-project.org(mailto:Rcpp-devel@lists.r-forge.r-project.org)
> > > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel@lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to