[fpc-devel] OO rewrite - technical questions

Michael Schnell mschnell at lumino.de
Fri Jul 23 15:18:58 CEST 2010


  On 07/23/2010 02:06 PM, Hans-Peter Diettrich wrote:
>
> Do you mean segment or general-purpose register(s)?
This depends on the arch. X86 does not really have general-purpose 
registers, while NIOS, ARM MIPS (and supposedly X86/64) has almost only 
general-purpose registers.
> How is that different from WinAPI?
The whole discussion here is that X86/32-WinAPI in fact uses a segment 
register for this purpose but it's nowhere decently documented.
Moreover (bus not a problem) I understand that gnu C on  X86/32 Linux 
uses a segment register as a pointer to the threadvar area, while the 
non-documented WinAPI uses a segment register as a pointer to a 
thread-dedicated structure that again contains a pointer to the 
threadvar area.
> When we consider threads created in a DLL/.so, too, then the platform 
> has to establish such conventions, for the entire app<->library ABI.
Not really. The main executable can create a thread and a function 
called in the thread can internally declare and use a static threadvar. 
So the ABI needs to document how the (ASM) function is supposed to 
access the threadvar it internally defines. As it needs to use a 
register for this, the ABI needs to define that the alee is to use 
exactly this register and (supposedly) that the callee is not supposed 
to modify it when it returns.
>
> How else should it be done, in a practical way? Registers are not a 
> solution, since:
> Assume you have 10 units, each of which declares only one threadvar - 
> then you would have to reserve 10 registers for these threadvars, 
> application-wide!
Sorry but here you are decently wrong.

With most archs all static variables (such as globals and threadvars) 
always are accessed relative to a register. With X86/32 globals and 
statics are allocated relative to DS, with X86/32-Linux, threadvars are 
allocated relative to FS. The archs i know, that don't have segment 
registers use "address"- or "general purpose" registers for this. So  we 
have two "basic data pointers": one for the normal static vars and one 
for the threadvars. Both are safe regarding preemption. The basic 
pointer for normal static vars is initialized at the program start and 
never changed within the application, the pointer to the threadvars is 
initialized when a thread starts and - because it is preemption save 
just like any other register - its never changed when this thread is 
running.

Moreover the point with threadvars is that threads that use the same 
code see different values in the same threadvar. These threads of course 
can't use different registers to access them as the run the same code.

>
> IMO this duplicates the OS overhead (for the thread memory (TLS) 
> implementation), in the application. A single threadvar then would be 
> sufficient for *all* threads, i.e. the one (register) provided for 
> thread-storage by the platform.
See "the point with threadvars...".
>
> Can you give a more concrete example?
See "the point with threadvars...".
>
> I'm not familiar with actual thread programming, so I have no idea 
> about the *usage* of threadvars in concrete code. 
Using threadvars only make sens for multiple threads running the same code.

-Michael



More information about the fpc-devel mailing list