[fpc-devel] threadvar implementation
Jonas Maebe
jonas.maebe at elis.ugent.be
Fri Aug 6 11:29:08 CEST 2010
On 06 Aug 2010, at 09:51, Michael Schnell wrote:
> On 08/06/2010 12:31 AM, Jonas Maebe wrote:
>> (but keep in mind that the only reason that intialising/finalising
>> threads not started via the FPC rtl now works under Unix is exactly
>> because every threadvar access requires a call into a helper
>> routine).
> Of course this is why I started the thread.
I said that the (recently introduced) support for externally started
threads under Unix *depends* on the fact that you cannot access a
threadvar without calling that helper routine at least once. You did
not start the thread with the purpose of breaking that support again,
but as I said such breakage would be a direct consequence of moving to
direct selector-based accesses on Unix platforms.
> The C compilers seem to work more efficient on that behalf and thus
> it might be viable to improve FPC.
If you really need fast access to a thread variable, take its address
and use that afterwards. That's what e.g. the heap manager does. In
general, I doubt that the speed of accessing threavars matters much to
most applications.
Nevertheless, if you want to add support for accessing threadvars
under Windows via a segment override, feel free to debug it. The basic
code is already in the compiler from previous (failed) experiments.
Uncomment tf_section_threadvars in compiler/systems/i_win.pas, and
grep for its occurrences in the compiler source code to see what it
does.
> To do that the details of how segment registers are used with the
> X86/32 architecture in Linux and Windows needs to be thoroughly
> understood.
This thread has gone on long enough about that subject, and most of
the details that have been discussed are completely irrelevant
regarding anything FPC would have to do when using them to access
threadvars. If you feel that anything further needs discussing about
that, then do it on a list specific to low level programming on Linux,
Windows or for the x86 architecture (or on fpc-other).
> (In fact I still don't know how the compiler should construct a
> pointer to a threadvar in Linux).
It (indirectly) calls CRelocateThreadvar() in rtl/unix/cthreads.pp
Jonas
More information about the fpc-devel
mailing list