Initializing D runtime and executing module and TLS ctors for D libraries
    Ali Çehreli 
    acehreli at yahoo.com
       
    Sun Jan 24 03:59:26 UTC 2021
    
    
  
Thank you very much for your answers. I think I've been on the right 
track and the following bug that I've mentioned has been messing up by 
hitting me randomly:
   https://issues.dlang.org/show_bug.cgi?id=11736
On 1/23/21 5:18 PM, IGotD- wrote:
 > During rt_init in the main thread, thread_attachThis is performed what I
 > have seen.
That explains why everything just works on most cases.
 > Actual ctor code that runs for each TLS thread is language specific and
 > not part of the ELF standard therefore no such TLS ctor code are being
 > run in the lower level API. The initialization (only copy and zeroing)
 > of TLS data is being done when each thread starts.
That must be the case for threads started by D runtime, right? It sounds 
like I must call rt_moduleTlsCtor explicitly for foreign threads. It's 
still not clear to me which modules' TLS variables are initialized 
(copied over). Only this module's or all modules that are in the 
program? I don't know whether it's possible to initialize one module; 
rt_moduleTlsCtor does not take any parameter.
 > This can even be done
 > in a lazy manner when the first TLS variable is being accessed.
I hope that's the case.
 > I have to make a generic API and then a D
 > API on top of that.
Did you mean a generic API, which makes calls to D? That's how I have 
it: an extern(C) API function calling proper D code.
 > In practice this means there is a trampoline
 > function involved where and thread_attachThis and thread_detachThis is
 > being called. Also this is where I call TLS ctors/dtors.
That's what I will be doing.
 > It is an effect
 > that delegates is language specific and it falls natural that way. Avoid
 > extern(C) calls directly into D code.
I hope I am misunderstanding you there. All I have are extern(C) 
function on the library API.
 > In practice you can do this for any thread even if there are several
 > delegates during the thread lifetime. You can simply have a TLS bool
 > variable telling if the thread_attachThis and rt_moduleTlsCtor have
 > already been run.
I've already experimented with it but it didn't work likely because of 
the bug mentioned above.
 > In general the main thread that goes into main must also be the last one
 > returning the entire line of functions that was called during entry of
 > the process.
Main entry belongs to another language, so I have to document that this 
library can only work in such "well behaved" cases.
 > What will happen is that you possibly do a
 > thread_detachThis twice.
Sounds like I can track that with a bool variable as well, no?
 > Short answer is just park the main thread while the bulk is being done
 > by other threads. Unfortunately that's how many libraries work today.
Agreed. That's for me to specify in the library documentation.
I should revive my old PR and see whether it is needed at all:
   https://github.com/dlang/druntime/pull/1989
I am surprised how much I had learned at that time and how much I've 
already forgotten. :/ For example, my PR involves thread_setThis, which 
seems to be history now:
 
https://docarchives.dlang.io/v2.068.0/phobos/core_thread.html#.thread_setThis
And thread_detachThis seems to be missing now:
   https://dlang.org/phobos/core_thread.html
   https://dlang.org/phobos/core_thread_osthread.html
Documentation issue or is it not needed anymore?
Ali
    
    
More information about the Digitalmars-d-learn
mailing list