[R] R_unload_[PACKAGENAME] not called

Duncan Murdoch murdoch.duncan at gmail.com
Wed Mar 28 17:00:31 CEST 2012


On 28/03/2012 10:25 AM, Henrik Alsing Friberg wrote:
> I experimented with this earlier, but it is indeed tricky business.
> Last I tried my registered finalizer addressed unmapped memory,
> because garbage collection happened after my package (and thus the
> clean-up stuff) was unloaded. This happened using the
> R_RegisterFinalizerEx function from C++ on some dummy SEXP object.
>
> Since cholmod_finish is an exported function from the Matrix package,
> it has to be called before the Matrix package is unloaded. I will try
> something like
>    >>  reg.finalizer(environment(Matrix), fun, onexit=TRUE)

If you still have trouble, you might want to study RODBC, which has to 
close down database connections.

Duncan Murdoch
> Thanks.
>
>
> On Mon, Mar 26, 2012 at 4:21 PM, Duncan Murdoch
> <murdoch.duncan at gmail.com>  wrote:
> >  On 26/03/2012 6:24 AM, Henrik Alsing Friberg wrote:
> >>
> >>  Hi R-help users..
> >>
> >>  I mistakenly posted a now rejected bug report
> >>  (https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14855), but the
> >>  subject still bugs me..!
> >>
> >>  If I have a package called MyPackage with C code inside, then library
> >>  or require(MyPackage) will call loadNamespace() which will look for
> >>  and call:
> >>  void R_init_MyPackage(DllInfo *info)
> >>
> >>  At the end of the R session, the corresponding unload function is
> >>  however *not* called.
> >>  void R_unload_MyPackage(DllInfo *info)
> >>
> >>  I use the two functions to call R_cholmod_start(CHM_CM) and
> >>  cholmod_finish(CHM_CM) respectively, and I think this might leak
> >>  memory if the latter is not called. Firstly, why is one called without
> >>  the package maker having to think about it, while the other is not?
> >>  Secondly, how do I make sure that the unload function is called --
> >>  using either .Last.lib or .onUnload to call unloadNamespace() seems
> >>  like a bad idea, as unloadNamespace() is documented to call back to
> >>  these hooks (the call cycle would have to by broken by other means)?
> >
> >
> >  You would normally use reg.finalizer() for this, or the C level equivalents
> >  (see the section on external pointers in Writing R Extensions).
> >
> >  Duncan Murdoch



More information about the R-help mailing list