On 23/07/2015 4:11 PM, Jeremy Manson wrote:
Okay. TBH, thinking about it more, it's a little weird for something named os::current_thread_id() to be different from Thread::current()->osThread->thread_id(), or for either of them to be different from "what the OS thinks the thread id is", so it seems like the Right Thing to Do (in the absence of any platform-specific issues).
When there are two different levels of thread ID it isn't that simple - especially as, like you say, one can be used to look in /proc while the other can't. So perhaps better naming is in order.
Cheers, David
Jeremy On Wed, Jul 22, 2015 at 10:57 PM, David Holmes <david.hol...@oracle.com <mailto:david.hol...@oracle.com>> wrote: 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> <mailto: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>> <mailto: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