[R] How to detach binary objects/libraries?
Peter Dimitrov
dimitrov at gnf.org
Tue Mar 26 00:50:34 CET 2002
On Mon, 2002-03-25 at 13:46, ripley at stats.ox.ac.uk wrote:
> On 25 Mar 2002, Peter Dimitrov wrote:
>
> > Hi all,
> >
> > First, I want to apologize if this question has been already answered. I
> > have a RedHat 7.2. system with recently patched version of R-1.4.1. I'm
> > in a process of writing R package, say X, that loads some C++ code.
> > Currently, while adding functionality to it in both R and C++ sources,
> > I'm getting crashes every time I detach/load/access the C++ function(s).
> > Typical transcript follows:
> >
> > > library(X)
> > Loading required package: mva
> > > is.loaded("exp_dist_fast") # The name of the C stub function
> > [1] TRUE
> > > detach(package:X)
> > > is.loaded("exp_dist_fast")
> > [1] TRUE # Problem?
> > > library(X) # Load X after changes in the C/C++ code
> > > is.loaded("exp_dist_fast") # or .C("exp_dist_fast",...)
> >
> > Process R:1 segmentation fault at Mon Mar 25 12:17:57 2002
> >
> > What is the way to cleanly unload the object code and is there better
> > mechanism than detach(package:X)?
>
> Does you package use .Last.lib to unload your shared library, X.so?
> If not, that will probably be your problem, as library.dynam will not
> reload it (and you probably use library.dynam).
>
> Take a look at package tcltk for an example.
Thank you, Prof. Ripley!
Adding .Last.lib solved the segmentantion fault problem. On the other
hand, it created the following puzzle. Transcript follows:
> library(X)
Loading required package: mva
> is.loaded("exp_dist_fast")
[1] TRUE
> detach(package:X)
> is.loaded("exp_dist_fast")
[1] FALSE
> library(X)
> is.loaded("exp_dist_fast")
[1] FALSE
> .C("exp_dist_fast",...)
Error in .C("exp_dist_fast", ...), :
C/Fortran function name not in load table
> detach(package:X)
Error in dyn.unload(x) : dynamic/shared library
"/opt/lib/R/library/X/libs/X.so" was not loaded
X's zzz.R follows:
.First.lib <- function( lib, pkg )
library.dynam( "X", pkg, lib )
.Last.lib <- function( libpath )
dyn.unload(
file.path( libpath,
"libs",
paste( "X", .Platform$"dynlib.ext", sep = "" )
)
)
Is the solution just to change library.dynam with dyn.load( file.path(
..))?
>
> I'm not sure what Linux does if you change a shared library that is in
> use, but it is not a good idea (and fatal on Solaris, for example).
It's probably quite wrong, but I was hoping that it will work much the
same way as in sourcing the original not-yet-in-a-package R file that
dynamically loads X.so. In Linux it reloads X.so without a problem.
>
> --
> 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 272860 (secr)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list