On 03/04/2013 12:47 PM, Michael Schnell wrote:

In all fpc enabled patforms I examined (X86 Windows, X86 Linux, X64-64 Windows, X86-64 Linux, ARM Linux (32 Bits) the platform provides as well library calls as dedicated threadvar pointer registers. In windows the registers seem to be undocumented but obviously "stable", as a change would break a lot existing C/C++ software.

All C/C++ compilers I examined used the threadvar pointer Registers for speed..


FWIW:
I rechecked this and can add these results:

With ARM, the pre-Cortex Arch on Linux uses A9 as a pointer to the TLS (Thread local Storage http://en.wikipedia.org/wiki/Thread-local_storage , that holds the threadvars). So (as with all x86 variants) no library or system call is necessary.

With Cortex, this has changed to the use of the CP15 Register (freeing A9 to allow for better optimization). Now, CP15 is in fact not very suitable for this purpose, as it can only be accessed with privileged instructions and thus not in user mode (where the TLS in fact is invented for). Thus a system call (or trap) is needed to get the address of a threadvar. As a system call supposedly is rather costly on ARM (invalidating the cache, as here, (other than with x86) the cache is closer to the CPU than the MMU) using a library call will not do additional harm.




Generally:

The frequent access to threadvars is necessary with threaded programs that use the same code in multiple threads to allow for each thread to find easily out "who I am" even in a deeply nested function environment.

But in an object driven language, this can easily be overcome by creating an instance of an object for each thread and with that, you always have the "Self" pointer as a thread specific entity. Happily "Self" resides on the stack that is dedicated for each thread, anyway, and is created automatically for any "procedure or object". So the use of any threadvar is necessary only when creating the thread-related object but it's not necessary to access any threadvar frequently.




Conclusion:

With FPC, the optimization of threadvar access is not necessary. Instead it is highly recommended to always use thread specific instances of the classes that do the threaded work. TThread of course provides this out of the box.

-Michael

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to