[Rd] unloading compiled code.

Andrew Redd amredd at gmail.com
Tue Nov 16 18:25:27 CET 2010


Are packages unloaded on quit so that the .Last.lib or .onUnload are
called for packages?

-Andrew

On Fri, Nov 12, 2010 at 3:52 PM, Andrew Redd <amredd at gmail.com> wrote:
> Perhaps you could help me make some sense of this.  Here is a printout
> of my sessions.
> ---
> toys$R -q
>> library(test2)
>> gpualloctest()
> testing allocation on gpu
> C Finished
> Collecting Garbage
> done.
>> q()
> Save workspace image? [y/n/c]: n
>
>  *** caught segfault ***
> address 0x7f12ec1add50, cause 'memory not mapped'
>
> Possible actions:
> 1: abort (with core dump, if enabled)
> 2: normal R exit
> 3: exit R without saving workspace
> 4: exit R saving workspace
> Selection: 1
> aborting ...
> Segmentation fault
> toys$R -q
>> library(test2)
>> gpualloctest()
> testing allocation on gpu
> C Finished
> Collecting Garbage
> done.
>> library.dynam.unload('test2',system.file(package='test2'))
>> q()
> Save workspace image? [y/n/c]: n
> toys$
> ---
>
> I have a in the test2/R/zzz.R file
> ---
> .onUnload <- function(libpath)
>    library.dynam.unload("test2", libpath)
> ---
>
> so the code should be unloaded.  But it appears that it is not from
> errors when I explicitly unload the test2.so it does not through a
> segfault.  Why would this be happening?  and how do I circumvent it.
>
> thanks,
> Andrew
>
>
> On Fri, Nov 12, 2010 at 3:32 PM, Prof Brian Ripley
> <ripley at stats.ox.ac.uk> wrote:
>> On Fri, 12 Nov 2010, Andrew Redd wrote:
>>
>>> I have a package that I'm developing that I need to unload the
>>> library.  Long story short I figured out that the leaving the compiled
>>> code loaded lead to a segmentation fault, but unloading the code will
>>> fix it.  I've read the documentation and it appears that there are
>>> several ways to do this?  What is the popper accepted current standard
>>> for unloading compiled code?
>>
>> Depends how you loaded it: you basically reverse the process.
>>
>>> The options as I understand them are:
>>> 1. dyn.unload
>>> 2. library.dynam.unload
>>> used with either
>>> A. .Last.lib
>>> B. .onUnload
>>>
>>> If it makes a difference my package does use a NAMESPACE so the
>>> package is loaded through useDynLib.
>>
>> So you need an .onUnload action calling library.dynam.unload.
>>
>> Slightly longer version: you need the DLL loaded whilst the namepace is in
>> use, so it has to be in .onUnload, and useDynLib calls library.dynam so you
>> need library.dynam.unload to do the housekeeping around dyn.unload which
>> matches what library.dynam does around dyn.load.
>>
>> There are quite a lot of examples to look at, including in R itself. MASS is
>> one example I've just checked.
>>
>> Having said all that, my experience is that unloading the DLL often does not
>> help if you need to load it again (and that is why e.g. tcltk does not
>> unload its DLL).
>>
>>> Thanks,
>>> Andrew Redd
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>> --
>> Brian D. Ripley,                  ripley at stats.ox.ac.uk
>> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
>> University of Oxford,             Tel:  +44 1865 272861 (self)
>> 1 South Parks Road,                     +44 1865 272866 (PA)
>> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
>>
>



More information about the R-devel mailing list