Getting the current thread ID without a syscall?
Konstantin Belousov
kostikbel at gmail.com
Wed Jan 16 05:12:24 UTC 2013
On Tue, Jan 15, 2013 at 06:03:30PM -0500, Trent Nelson wrote:
> On Tue, Jan 15, 2013 at 02:33:41PM -0800, Ian Lepore wrote:
> > On Tue, 2013-01-15 at 14:29 -0800, Alfred Perlstein wrote:
> > > On 1/15/13 1:43 PM, Konstantin Belousov wrote:
> > > > On Tue, Jan 15, 2013 at 04:35:14PM -0500, Trent Nelson wrote:
> > > >>
> > > >> Luckily it's for an open source project (Python), so recompilation
> > > >> isn't a big deal. (I also check the intrinsic result versus the
> > > >> syscall result during startup to verify the same ID is returned,
> > > >> falling back to the syscall by default.)
> > > > For you, may be. For your users, it definitely will be a problem.
> > > > And worse, the problem will be blamed on the operating system and not
> > > > to the broken application.
> > > >
> > > Anything we can do to avoid this would be best.
> > >
> > > The reason is that we are still dealing with an "optimization" that perl
> > > did, it reached inside of the opaque struct FILE to "do nasty things".
> > > Now it is very difficult for us to fix "struct FILE".
> > >
> > > We are still paying for this years later.
> > >
> > > Any way we can make this a supported interface?
> > >
> > > -Alfred
> >
> > Re-reading the original question, I've got to ask why pthread_self()
> > isn't the right answer? The requirement wasn't "I need to know what the
> > OS calls me" it was "I need a unique ID per thread within a process."
>
> The identity check is performed hundreds of times per second. The
> overhead of (Py_MainThreadId == __readgsdword(0x48) ? A() : B()) is
> negligible -- I can't say the same for a system/function call.
>
> (I'm experimenting with an idea I had to parallelize Python such
> that it can exploit all cores without impeding the performance
> of normal single-threaded execution (like previous-GIL-removal
> attempts and STM). It's very promising so far -- presuming we
> can get the current thread ID in a couple of instructions. If
> not, single-threaded performance suffers too much.)
If the only thing you ever need is to get a unique handle for the
current thread, without the requirement that it corresponds to any
other identifier, everything becomes much easier.
On amd64, use 'movq %fs:0,%register', on i386 'movl %gs:0,%register'.
This instruction is guaranteed to return the thread-unique address
of the tcb. See an article about ELF TLS for more details.
Even better, this instruction is portable among all ELF Unixes which
support TLS.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20130116/6de801ac/attachment-0001.sig>
More information about the freebsd-hackers
mailing list