[R] Reloading a shared library with dyn.load

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri May 16 12:59:43 CEST 2003


Thank you for the corrections -- my knowledge is clearly out of date, but 
I have been bitten by this in the past.

Apologies for misleading people.

On Fri, 16 May 2003, Duncan Temple Lang wrote:

> Prof Brian Ripley wrote:
> > As there is AFAIK no way to unregister entry points, you cannot safely
> > unload a DLL with registered entry points (which is what your code appears
> > to do).  So if you want to do this, don't register them,
> 
> This is not true.  The unloading of a shared library automatically
> unregisters the entry points (the routine Rf_freeDllInfo in
> Rdynload.c). So using the registration is not a problem.
> 
> Checking this on both my Linux and Windows boxes running 1.7 patched
> doesn't cause any problems.  Adding a static variable to the
> HelloFromC routine and both incrementing it and adding its value to
> the returned string in each call illustrates that when a second
> dyn.load() call is made, a new version of the library comes in.
> 
> So I can't reproduce the problem directly from the commands.
> Something that comes to mind is that another process has got a lock on
> the file. But I don't see that as likely.
> 
> 
> > 
> > Package tcltk does unload its DLL (so the Tcl/Tk dlls get released) if 
> > detached, and so was not modified to register.
> > 
> > Until un-registration is provided, I would not use the registration 
> > mechanisms during development.
> 
> This is *NOT* a necessary precaution.  Registration has the potential
> to improve this situation rather than diminishing it. So please don't
> let this discourage people from using registration.
> 
>  D.
> 
> 
> > 
> > On Fri, 16 May 2003, James Wettenhall wrote:
> > 
> > > Hi,
> > > 
> > > I'm using dyn.load to load a shared library (compiled from C 
> > > code) into R.  If I dyn.unload it and then dyn.load it again, I 
> > > get an hourglass icon in Rgui (R 1.7.0, Win 2000), and it 
> > > just sits there forever.  I can't press Escape to stop the 
> > > current computation, but I can close Rgui without resorting to 
> > > using the Task Manager.
> > > 
> > > Is it a problem with my use of R_alloc?  Do I need something 
> > > like R_cleanup?  Or is it a problem with dyn.load?
> > > 
> > > I'll demonstrate how I compile a C file, HelloFromC.C into a 
> > > shared library, HelloFromC.dll and then load it into R.
> > > 
> > > HelloFromC.c
> > > ------------
> > > #include <R.h>
> > > #include <Rinternals.h>
> > > #include <R_ext/Rdynload.h>
> > > #include <R_ext/Memory.h>
> > > #include <R_ext/Applic.h>
> > > #include <stdio.h>
> > > 
> > > void HelloFromC(char **result)
> > > {
> > >    *result = (char *) R_alloc(20,sizeof(char));
> > >    sprintf(*result,"Hello from C!"); 
> > > }
> > > 
> > > static const
> > > R_CMethodDef CEntries[] = {
> > > {"HelloFromC",(DL_FUNC) &HelloFromC,1},
> > > {NULL,NULL,0}
> > > };
> > > 
> > > void R_init_HelloFromC(DllInfo *info)
> > > {
> > >     R_registerRoutines(info,CEntries,NULL,NULL,NULL);
> > > }
> > > 
> > > ----------------------------------------------------------------
> > > c:\james\HelloFromC> Rcmd SHLIB HelloFromC
> > > making HelloFromC.d from HelloFromC.c
> > > gcc   -IC:/JAMES/rw1070/src/include -Wall -O2   -c HelloFromC.c 
> > > -o HelloFromC.o
> > > ar cr HelloFromC.a *.o
> > > ranlib HelloFromC.a
> > > gcc  --shared -s  -o HelloFromC.dll HelloFromC.def HelloFromC.a  
> > > -LC:/JAMES/rw1070/src/gnuwin32  -lg2c -lR
> > > -----------------------------------------------------------------
> > > 
> > > Now in R 1.7.0...
> > > -----------------
> > > 
> > > > dyn.load("HelloFromC")
> > > > result <- ""
> > > > .C("HelloFromC",result)[[1]]
> > > [1] "Hello from C!"
> > > > dyn.unload("HelloFromC")
> > > > dyn.load("HelloFromC")
> > > 
> > > This is where it freezes.
> > > 
> > > Any suggestions?
> > > 
> > > Regards,
> > > James
> > > 
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch mailing list
> > > https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> > > 
> > 
> > -- 
> > 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
> > 
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> 
> 

-- 
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-help mailing list