[R] Reloading a shared library with dyn.load
Duncan Temple Lang
duncan at research.bell-labs.com
Fri May 16 12:55:28 CEST 2003
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
--
_______________________________________________________________
Duncan Temple Lang duncan at research.bell-labs.com
Bell Labs, Lucent Technologies office: (908)582-3217
700 Mountain Avenue, Room 2C-259 fax: (908)582-3340
Murray Hill, NJ 07974-2070
http://cm.bell-labs.com/stat/duncan
More information about the R-help
mailing list