Hard-to-reproduce GC bug

Walter Bright newshound1 at digitalmars.com
Fri Dec 5 14:38:03 PST 2008


dsimcha wrote:
> Thanks, though I'm way ahead of you in that I already did this.  Works great,
> except it's a little bit slow.

TLS is always going to be slow. Beating the old drum about how freakin' 
useful a tool obj2asm is and why doesn't anyone use it, here's what it 
looks like:

--------------------

__thread int foo;
void main()
{
     foo = 3;
}

---------------------
__Dmain comdat
         assume  CS:__Dmain
                 mov     EAX,__tls_index
                 mov     ECX,FS:__tls_array
                 mov     EDX,[EAX*4][ECX]
                 mov     dword ptr _D5test63fooi[EDX],3
                 xor     EAX,EAX
                 ret
__Dmain ends
---------------------

So you see, it takes 4 instructions to reference a TLS global vs 1 
instruction for regular static data. The lesson is to minimize directly 
referencing such globals. Instead, take a pointer to them, or cache the 
value into a local.

As for whether __thread is completely implemented, yes it is completely 
implemented in the compiler. I obviously forgot about the gc, though, 
and I'm glad you found the problem so I can fix it. In the meantime, you 
can call the gc directly to register your __thread variable as a 'root', 
then the gc will recognize it properly.

If you want to read about how TLS works under Windows, see:

http://www.nynaeve.net/?p=180

It works an equivalent, but completely differently under the hood, way 
in Linux:

http://people.redhat.com/drepper/tls.pdf



More information about the Digitalmars-d mailing list