rt_init, rt_term and _initCount
Patrick Schluter via Digitalmars-d
digitalmars-d at puremagic.com
Thu Oct 20 02:51:52 PDT 2016
On Thursday, 20 October 2016 at 07:17:49 UTC, Benjamin Thaut
wrote:
> This is a topic really specific to druntime, I don't know a
> better place to put it though.
>
> rt_init increases the _initCount and rt_term decreases it and
> only terminates the runtime in case the _initCount reaches zero
> (see dmain2.d)
>
> The problem now is as follows.
> Each dynamic library that is loaded (in this case a .dll on
> windows) must ensure that druntime is intialized. This must be
> done to ensure that d dynamic libraries work with C processes
> that load them. So lets assume we have a exe and two dlls: DllA
> and DllB. The exe uses the two dlls and druntime. What will
> happen is the following
>
>
> 1) Exe starts up
> 2) The windows loader will load DllA. This will call rt_init
> _initCount will be 1. Druntime will be initialized. Module
> ctors of druntime will be called. Module Ctors of DllA will be
> called.
> 3) The windows loader will load DllB. _initCount will be 2.
> Module Ctors of DllB will be called.
> 4) The dmain function will be execued. It will call rt_init.
> _initCount is 3. Module ctors of exe will be called.
> 5) Dmain finishes and calls rt_term. _initCount is 2. Nothing
> happens
> 6) The windows loader will unload DllB. rt_term is called.
> _initCount is 1. DllB is forced to call its module dtors.
> 7) The windows loader will unload DllA. r_term is called.
> _initCount is 0. Module Dtors of exe will be called. Module
> Dotrs of DllA will be called. Module Dtors of druntime will be
> called.
>
> As might observed the issue is the order in which the module
> dtors are called. The order is
>
> Druntime Ctor
> DllA Ctor
> DllB Ctor
> ExE Ctor
> DllB Dtor
> Exe Dtor
> DllA Dtor
> Druntime Dtor
>
> Whereas it should be:
>
> Druntime Ctor
> DllA Ctor
> DllB Ctor
> ExE Ctor
> Exe Dtor
> DllB Dtor
> DllA Dtor
> Druntime Dtor
>
> The problem is step 5) in the above list. When the main
> executable leaves dmain the runtime should be deinitialized no
> matter if any dll is still loaded or not. If this would be the
> case the module Dtors would be calle din the correct order. I
> can't remove the rt_init calls from the dll loading code
> however because that would mean when loading a d-dll into a C
> process druntime would never be initialized. So I'm thinking of
> adding a force parameter to rt_term which will always
> deinitialize druntime disregarding the _initCount. This feels
> like a hack though.
>
> Any suggestions how to solve this problem? Who are other
> platforms doing it?
>
> Kind Regards
> Benjamin Thaut
I don't know anything about the druntime code but the solution
seems to look like rt_term() should kick the call to the
destructor when the initcound matches with the initcount it had
when it called rt_init(). But as I already said, I'm talking out
of my ass here as I never even looked in the code.
More information about the Digitalmars-d
mailing list