static ctors in shared libs
Johannes Pfau via Digitalmars-d
digitalmars-d at puremagic.com
Thu Mar 17 13:54:57 PDT 2016
Am Thu, 17 Mar 2016 20:27:39 +0000
schrieb bitwise <bitwise.pvt at gmail.com>:
> I've been doing some work on shared libraries for OSX, and have
> come across a potential problem, which I'm not sure what to do
> with.
>
> Currently, when a thread is spawned, that thread calls all the
> TLS ctors, then runs the thread entry point function, and finally
> calls the TLS dtors before the thread terminates.
>
> Example, for windows:
>
> https://github.com/D-Programming-Language/druntime/blob/15a227477a344583c4748d95492703901417f4f8/src/core/thread.d#L236
>
> So, the question is, how do dynamic libraries interact here?
>
> Example: A dynamic library contains D modules with TLS ctors. If
> I start a few threads, and then load a dynamic library, shouldn't
> the TLS ctors in the dynamic library be called for each running
> thread? If my assumption is correct, the next question is, how do
> you do this?
>
> I don't think you can hijack each thread and have it run the TLS
> ctors, and you can run them all from the thread loading the
> shared library because of synchronization issues. So what's the
> solution? Should TLS ctors in dynamic libraries simply be
> specified not to run, or could they somehow be run lazily at the
> first TLS access in a dynamic library?
>
> Any thoughts on this would be appreciated.
>
> Thanks,
> Bit
>
It's been some time since I looked at that code, but IIRC TLS ctors for
newly loaded libraries are not run in old threads. There's nothing we
can do about this without help from the C runtime.
As TLS ctors are meant to initialize TLS storage the correct time to
run these is after the per-thread TLS storage allocation. (The C
runtime can actually allocate TLS memory lazily, on the first access to
a TLS variable in a module). The C runtimes of course know when TLS
storage is allocated, but they do not provide hooks we could use.
More information about the Digitalmars-d
mailing list