[Rd] unloading compiled code.

Andrew Redd amredd at gmail.com
Tue Nov 16 18:50:52 CET 2010


Just found in the documentation for getHook that packages are not
unloaded on quit.  How should I force a package to unload on quit?

-Andrew

On Tue, Nov 16, 2010 at 10:25 AM, Andrew Redd <amredd at gmail.com> wrote:
> 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