On 23/07/2015 8:01 AM, Jeremy Manson wrote:
Based on the feedback, this seems to be a good idea, approximately.
Coleen would have sponsored, but she's going on vacation.  Anyone else
feel like sponsoring?

Hold up a minute! :) There are different notions of "native thread id" that exist. First we have the "user level thread id" - this is what is reported by pthread_self in POSIX and thr_self in UI. Then we also have the OS specific "thread" id, also referred to as a LWP or "kernel scheduling entity" or "kernel thread" - the id for this is what gettid() maps back to on Linux. This distinction may not exist on all platforms.

Unfortunately os::current_thread_id does not define which of these it represents:

 // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit
  static intx current_thread_id();

and so on some platforms it returns the "user thread id" (eg pthread_self()), and on some it returns the same as gettid (ie OSX - but I don't know if the mach thread id is truly a "LWP" id ?).

Also note that on some platforms the osThread stores the id of the "user-level thread" and on some the "kernel thread". Hence another source of confusion. :(

So if you want to enforce that os::current_thread_id() represents the "kernel thread" then that should be applied consistently across all platforms**, and for platforms for which there is a change to make you have to ensure the usage of os::current_thread_id() is not semantically altered by the change.

** Of course a platform may only have a single notion of "thread"

I'm happy to sponsor such a proposal. And don't worry about maintaining compatibility with archaic Linux versions for JDK9 (less cleanup to do later).

Thanks,
David

Jeremy

On Wed, Jul 22, 2015 at 11:22 AM, Jeremy Manson <jeremyman...@google.com
<mailto:jeremyman...@google.com>> wrote:

    Hey folks,

    os::current_thread_id on Linux now maps to pthread_self.  The
    problem with pthread_self is that it only makes sense in the context
    of the running process.  When it is written out to the log (as it is
    in several places), there really isn't a way (AFAICT) for the user
    to map it back to anything useful.

    As it happens, that value is mostly used to write to the log.  The
    places where it doesn't do so don't seem to need to use pthread_self
    for any particular reason.

    Meanwhile, the SIGQUIT stack dump
    uses java_thread->osthread()->thread_id() as the nid.  On Linux,
    that maps back to os::Linux::gettid(), whish is also what gets
    exposed in /proc.  That makes it much easier to see what threads
    might be doing the log write.

    Would it be okay to change os::current_thread_id to point
    to os::Linux::gettid()?  That way, it can be mapped back to the
    output of a SIGQUIT dump.

    The downside of gettid() is that it is only available on
    Linux>2.4.11, but that dates from 2001.  If we really still want to
    support it, we could check for that.

    Thoughts?

    Jeremy


Reply via email to