[dmd-internals] __tls_callbacks_a

Alex xtzgzorex at gmail.com
Thu Jan 19 23:53:07 PST 2012


The way I see it, we can do three things:

a) Do something similar to what mingw is doing:
http://mingw-w64.svn.sourceforge.net/viewvc/mingw-w64/trunk/mingw-w64-crt/crt/tlssup.c?revision=4739&view=markup
(line 44 to 57). This is problematic because we're going to need a
pragma in D to place data in the right place.
b) Use a callback registration mechanism. That is, snn.lib defines a
global handler that it emits to _tls_used. When this handler is
called, it will enumerate and call all registered callbacks. So we
would need to expose two functions to register and deregister
callbacks.
c) The really dirty way: Add a linker flag that lets you overwrite the
symbol regardless of previous different definitions.

Any thoughts on what would be best?

Regards,
Alex

On Fri, Jan 20, 2012 at 3:00 AM, Walter Bright <walter at digitalmars.com> wrote:
> Here's the source code for it. If you can propose a change to it, I can
> merge it in.
> -----------------------------------------------------------------------------------------
> /*_ tlsdata.c   Tue Jan 24 1995 */
> /* Copyright (C) 1995 by Digital Mars */
> /* All Rights Reserved                          */
> /* $Revision: 1.1.1.1 $ */
>
> #if defined(_WIN32)
>
> /************************************************************************
>  * This file contains the necessary declartions for __declspec(thread)
>  * support.  The main work is done by the linker.  The values in tls_used
>  * are fixed up into a special segment by the linker that NT will then
>  * fix up to FS:__tls_array for each thread.
>  *   See file tlsseg.asm for other declarations.
>  */
>
>  extern long _tlsstart;
>  extern long _tlsend;
>
>  unsigned _tls_index = 0;  /* index referred to by compiler */
>  void *_tls_callbacks_a[1] = { 0 };
>
>  struct {
>    void *tlsstart;   /* contains address of start of tls segment (Raw Data
> Start VA) */
>    void *tlsend;     /* contains address of end of tls segment */
>    void *tlsindex;   /* contains address of index into tls segment */
>    void *tlscallbacks;  /* Pointer to an array of TLS callback functions
>                            The array is null-terminated, so if there
>                            is no callback function support, this field
>                            points to four bytes set to 0.  The prototype
>                            for these functions is the same as DLL-Entry.
>                            These are most useful for declspec(thread) tagged
>                            objects which need to be constructed and
> destructed
>                            for each thread that attaches.
>                          */
>    long  zerofill;   /* The size in bytes of hte template beyond the
>                         initialized data defined by tlsstart
>                         and tlsend.  The total template
>                         size should be the same as the total size of TLS
>                         data in the image file.  The zero fill is the amount
>                         of data that comes after the initialized non-zero
> data
>                         The linker fills this in at link time.
>                       */
>    long  characteristics;  /* Reserved, currently not used */
>
>  } _tls_used = {
> &_tlsstart,
> &_tlsend,
> &_tls_index,
> &_tls_callbacks_a[0],
>    0,
>    0
>  };
>
> #endif
>
>
> _______________________________________________
> dmd-internals mailing list
> dmd-internals at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals


More information about the dmd-internals mailing list