I thought I would update with what I did. Not liking overwriting the .Last function in case another package I decided to see if the reg.finalizer would work. This is what my .onLoad function look like. --- .onLoad<-function(libname, pkgname){ e<-emptyenv() library.dynam('gpuBayes',package=pkgname) reg.finalizer(e,function(...){unloadNamespace(pkgname)},T) } .onUnload<-function(libpath){ library.dynam.unload('gpuBayes',libpath) } --- This takes attaches a reg.finalizer to the empty environment with onexit=T. Since the empty environment will never be collected this will only run on exit.
-Andrew On Tue, Nov 16, 2010 at 6:34 PM, Charles C. Berry <cbe...@tajo.ucsd.edu> wrote: > On Tue, 16 Nov 2010, Andrew Redd wrote: > >> so should I use reg.finalizer or overwrite .Last()? > >> .Last > > Error: object '.Last' not found >> > > You create your own .Last - there is nothing to overwrite. > > Chuck > > > If I use >> >> reg.finalizer, what should be the environment that I specify? The >> straight forward solution would be to have a hook .onExit that a >> package could specify to make sure that the code was unloaded before >> the program terminates, that way I don't overwrite .Last if if has >> another purpose. >> >> -Andrew >> >> On Tue, Nov 16, 2010 at 11:27 AM, Charles C. Berry <cbe...@tajo.ucsd.edu> >> wrote: >>> >>> On Tue, 16 Nov 2010, Andrew Redd wrote: >>> >>>> Just found in the documentation for getHook that packages are not >>>> unloaded on quit. How should I force a package to unload on quit? >>> >>> See >>> >>> ?q >>> >>> >>> HTH, >>> >>> Chuck >>> >>>> >>>> -Andrew >>>> >>>> On Tue, Nov 16, 2010 at 10:25 AM, Andrew Redd <amr...@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 <amr...@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 >>>>>> <rip...@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@r-project.org mailing list >>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Brian D. Ripley, rip...@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 >>>>>>> >>>>>> >>>>> >>>> >>>> ______________________________________________ >>>> R-devel@r-project.org mailing list >>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>> >>> >>> Charles C. Berry Dept of Family/Preventive >>> Medicine >>> cbe...@tajo.ucsd.edu UC San Diego >>> http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego >>> 92093-0901 >>> >>> >> >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > Charles C. Berry Dept of Family/Preventive > Medicine > cbe...@tajo.ucsd.edu UC San Diego > http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901 > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel