TLS for Android (and iOS)
    Dan Olson 
    zans.is.for.cans at yahoo.com
       
    Mon Mar 31 08:23:03 PDT 2014
    
    
  
Jacob Carlborg <doob at me.com> writes:
> Regardless of the license, you can still give a try to see if the
> technical parts work.
I have tried and success.
I added threadLocalHelpers.s and threadLocalVariables.c, modified to
enable for arm, then had to sprinkle in some missing types from
dl_priv.h.  Then put in a call to tlv_initializer().
The proof is that thread locals get proper initial values when accessed
through tlv_get_addr().  For example, a thread local double is being
initialized to nan.
Still having LLVM emit a __tls_get_addr, so to try this out, I changed
my test __tls_get_addr() implementation to forward to tlv_get_addr() in
threadLocalHelpers.s.
    extern (C)
    void* __tls_get_addr(TLVDescriptor* tlvd)
    {
        __gshared static ubyte data[512];
        printf("__tls_get_addr %p \n", tlvd);
        printf("thunk %p, key %u, offset %u\n",
               tlvd.thunk, tlvd.key, tlvd.offset);
        // tlv_initializer() will change thunk to tlv_get_addr
        if (tlvd.thunk is &tlv_get_addr) {
            puts("calling real tlv_get_addr instead");
            return tlv_get_addr(tlvd);
        }
        // tlv not initialized yet, return my fake thread local data.
        return data.tlvd + tlvd.offset;
    }
    
    
More information about the digitalmars-d-ldc
mailing list