[fpc-devel] threadvar implementation
Michael Schnell
mschnell at lumino.de
Thu Aug 5 10:36:57 CEST 2010
On 08/04/2010 09:40 PM, "Vinzent Höfler" wrote:
> JFTR, plain vanilla C (i.e. ISO C99) does not even have a notion of a "thread variable", because it doesn't have threads. So I don't know what C you're referring to here.
GNU C provides the "__thread" keyword to specify threadvars. M$ C
provides "declspec(thread)" for the same purpose. I did check that this
work (with M$C on WIN32 and with GNU C on NIOS/Linux) and took a look at
the code constructed when accessing a threadvar.
I do know that there are GNU C implementations that don't support the
__thread keyword, so it seems to be "optional".
In fact I did not reverse-engineer how one of these compiler deals with
pointers to threadvars, but as __thread is a specification to a type and
C can construct a pointer to any definable type, not doing it the
correct way would be erroneous.
> No need to. The segment value is not used by LEA. It calculates the "effective address" which basically means the offset.
Yep "basically". :) But with other instructions the same notation and
description as used for "effective address" with LEA is used to access a
value in memory and thus the 48 bit "Logical address" (see Figure 3-5
in http://flint.cs.yale.edu/cs422/doc/24547212.pdf ). I in fact did
expect that LEA just works works with "Offsets", but I feel that it is
not really unambiguously stated in the docs.
> I'm sure you meant "FS prefix". DS doesn't have one AFAIR.
I did not check this
DS: PUSH AX
might make some kind of sense :)
> Loading the effective address. Any decent assembler could "optimize" that code into a "mov eax, 34h".
the optimization would be just do kill the obviously unused prefix
instruction.
> Or do that beforehand and "simply" store the pointer to the threadvar.
There is no "the threadvar", as the memory location of same is different
with each thread. So even the wording "the pointer to the threadvar" is
ambiguous. If the pointer variable itself is a threadvar or a local var
in a function, it might hold the correct thread specific address of the
threadvar.
If the pointer variable is static or global, it can be used in one
thread and hold the address of the thread var specific for _another_
thread.
So what do we want to accomplish in a certain program ?
This obviously is not a problem of the compiler or the implementation,
but a more "general" issue.
-Michael
More information about the fpc-devel
mailing list