On 23/07/2015 3:15 PM, Jeremy Manson wrote:
Hey David,

Thanks for the offer of sponsorship.  My goal here is really to make the
log output on Linux usable.  I want to be able to map the log output
back to an actual thread.  I don't think it really matters to users if
the API consistently means "kernel thread ID" or "threading API thread
ID", as long as they can figure out what the output means.

I think consistency is important else developers don't know what they should be using where - which is the current situation.

Since what I am doing (in effect) to accomplish my goal is to ensure
that the API returns the same value as osthread()->thread_id() does for
the current thread,  I could just... do precisely that.
os::current_thread_id could just return osthread()->thread_id() for the
current thread. I don't have easy access to anything for testing other
than Linux, though, so whether it worked (or even compiled) on the other
platforms would be a bit of a guess (per the last time we did this dance).

Defining os::current_thread_id() to be Thread::current()->osThread()->thread_id() assumes you can make those calls in the context in which os::current_thread_id() is used - if we crash during thread startup then some of those may be null and the id not even set. The current implementation is independent of the state of thread within the VM.

So its okay to return the same thing as Thread::current()->osThread()->thread_id() but it needs to be done directly.

Again any platform for which this would cause a change in behaviour needs to be examined. It may be other platforms have the same problem you are trying to fix for linux.

If I get time later I'll try to check what each platform does.

Thanks,
David

Seem reasonable?

Jeremy

On Wed, Jul 22, 2015 at 7:08 PM, David Holmes <david.hol...@oracle.com
<mailto:david.hol...@oracle.com>> wrote:

    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>
        <mailto: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