Merge pull request #593 from dawgfoto/dynamicLoading

Zhouxuan pycerl at qq.com
Sat Sep 7 11:46:26 PDT 2013


On Saturday, 7 September 2013 at 17:09:17 UTC, Martin Nowak wrote:
> We just merged the low-level implementation for full shared 
> library support. There should be an article or some tutorial 
> but I simply lack the time for that. So if you want to 
> experiment with it you should read this and have a look at the 
> test cases 
> (https://github.com/D-Programming-Language/druntime/tree/master/test/shared).
> I'd be thankful for every bug report, please add the keyword 
> dll 
> (http://d.puremagic.com/issues/buglist.cgi?keywords=dll&resolution=---).
>
>
> Just a repost of the github comment 
> (https://github.com/D-Programming-Language/druntime/pull/593#issuecomment-23913789).
>
> I updated and finished the low-level implementation.
> This now supports almost all shared library scenarios merely 
> automatically.
> It is also tested pretty thoroughly.
> Here are the main gotchas for experimenting.
>
> There is an extra layer of thread local reference accounting 
> over the global one in the runtime linker which has some 
> implications on how to use shared libraries.
>
> Loading libraries should only be done through 
> Runtime.loadLibrary/Runtime.unloadLibrary
> (or rt_loadLibrary/rt_unloadLibrary for C), so that the thread 
> local accounting doesn't
> miss anything.
> The recommended pattern to load a D library from a pure C 
> program is to dlopen
> phobos/druntime first and to use 
> rt_loadLibrary/rt_unloadLibrary hereafter.
>
> Loading a library only initializes it and it's linked 
> dependencies for the current
> thread.
>
> Threads where a library is not initialize will not see the 
> library's modules, nor the EH
> tables and the GC will miss to scan the library's TLS memory.
>
> A spawned thread (core.thread.Thread) will initialize the same 
> libraries as it's parent
> thread. There is an implicit dlopen call for every dynamically 
> loaded library so to
> prevent the parent thread from unloading. When a thread 
> finishes it will drop/unload all
> remaining references to loaded libraries.
> The high-level implementation of the shared libraries support 
> will provide a method to
> iterate over all loaded libraries, thus it will be possible to 
> explicitly unload unused
> inherited libraries.
>
> Finding the dependencies of a library is somewhat expensive so 
> it is only performed for D libraries and non-recursively.
>
> Because all dependencies are loaded before the library itself 
> we do know the recursive dependencies. In case of loading a C 
> library that depends on D libraries or for D->C->D dependency 
> chains we will miss the recursive dependency.
> This might possibly lead to uninitialized threads when loading 
> such a library in more than one thread.
> I will try to fix any arising bugs ASAP but I don't have much 
> time left currently.
> Please tag bugzilla entries with the dll keyword.
>
> Work on the high-level interface will start around the end of 
> next week.

Good job, Congrats!!


More information about the Digitalmars-d mailing list