Hi Renaud I cannot presently step through the code on Windows to verify the cause of the problem, but looking at the code, I would _presume_ the reason is that symbol lookup is cached on Windows but not on Linux or OS X (at least by default). Thus when we perform the second search for user_unif_rand, we find it in the cache rather than searching all the DLLs.
This happens because we did not specify a value for the PACKAGE parameter. When we load a new DLL, the cache should probably be cleared or we intelligently update it as necessary for the new DLLs on demand, i.e. for a new search for a symbol we look in the new DLLs and then use the cache. (This involves some book-keeping that could become convoluted.) If we had specified a value for PACKAGE, e.g. getNativeSymbolInfo("user_unif_rand", "rstream") we would get the version in that package's DLL. So this gives a workaround that you can use with just R code findNativeSymbolInfo = function(sym, dlls = rev(getLoadedDLLs())) { for(d in dlls) { z = getNativeSymbolInfo(sym, d) if(!is.null(z)) return(z) } NULL } We'll think about whether to change the behaviour on Windows and how to do it without affecting performance excessively. Best, D. On 8/17/11 9:12 AM, Renaud Gaujoux wrote: > Hi, > > When loading a package that provides the user-supplied RNG hook > user_unif_rand, calling > getNativeSymbolInfo("user_unif_rand") returns informations about the loaded > symbol. > I am using this to identify which package currently provides the RNG hook. > The results are the same on windows and linux if only one library provides > the hook. > > If one loads a second package that provides this hook, then on linux (Ubuntu > 10.10), calling again > getNativeSymbolInfo("user_unif_rand") returns the latest symbol information > (which I presume is the correct result). > On windows (XP and Vista) however the symbol information does not change > (same pointer address) and the package data is > NULL. > See results for both systems below. I tested this with R 2.12.1, 2.13.0 and > 2.13.1 on Windows. > > Is this a normal behaviour for dll loaded on Windows? > Thank you. > > Renaud > > > ##################### > # LINUX > ##################### >> library(rlecuyer) >> getNativeSymbolInfo("user_unif_rand") > $name > [1] "user_unif_rand" > > $address > <pointer: 0x7ff55acffed0> > attr(,"class") > [1] "NativeSymbol" > > $package > DLL name: rlecuyer > Filename: > /home/renaud/R/x86_64-pc-linux-gnu-library/2.12/rlecuyer/libs/rlecuyer.so > Dynamic lookup: TRUE > > attr(,"class") > [1] "NativeSymbolInfo" >> library(rstream) >> getNativeSymbolInfo("user_unif_rand") > $name > [1] "user_unif_rand" > > $address > <pointer: 0x7ff55aaf58c0> > attr(,"class") > [1] "NativeSymbol" > > $package > DLL name: rstream > Filename: > /home/renaud/R/x86_64-pc-linux-gnu-library/2.12/rstream/libs/rstream.so > Dynamic lookup: TRUE > > attr(,"class") > [1] "NativeSymbolInfo" > > ##################### > # WINDOWS > ##################### >> library(rlecuyer) >> getNativeSymbolInfo("user_unif_rand") > $name > [1] "user_unif_rand" > > $address > <pointer: 0x6bb84fb8> > attr(,"class") > [1] "NativeSymbol" > > $package > DLL name: rlecuyer > Filename: C:/Program > Files/R/R-2.13.1/library/rlecuyer/libs/i386/rlecuyer.dll > Dynamic lookup: TRUE > > attr(,"class") > [1] "NativeSymbolInfo" >> library(rstream) >> getNativeSymbolInfo("user_unif_rand") > $name > [1] "user_unif_rand" > > $address > <pointer: 0x6bb84fb8> > attr(,"class") > [1] "NativeSymbol" > > $package > NULL > > attr(,"class") > [1] "NativeSymbolInfo" > > > > > > > > > ### > UNIVERSITY OF CAPE TOWN > This e-mail is subject to the UCT ICT policies and e-mai...{{dropped:5}} > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel