diff --git a/make/hotspot/symbols/symbols-unix b/make/hotspot/symbols/symbols-unix --- a/make/hotspot/symbols/symbols-unix +++ b/make/hotspot/symbols/symbols-unix @@ -118,6 +118,7 @@ JVM_GetMethodParameters JVM_GetMethodTypeAnnotations JVM_GetNanoTimeAdjustment +JVM_GetNativeThreadID JVM_GetPrimitiveArrayElement JVM_GetProtectionDomain JVM_GetSimpleBinaryName diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h --- a/src/hotspot/share/include/jvm.h +++ b/src/hotspot/share/include/jvm.h @@ -258,6 +258,9 @@ JNIEXPORT void JNICALL JVM_SetNativeThreadName(JNIEnv *env, jobject jthread, jstring name); +JNIEXPORT jlong JNICALL +JVM_GetNativeThreadID(JNIEnv *env, jobject jthread); + /* getStackTrace() and getAllStackTraces() method */ JNIEXPORT jobjectArray JNICALL JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads); diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -3127,6 +3127,19 @@ } JVM_END +JVM_ENTRY(jlong, JVM_GetNativeThreadID(JNIEnv* env, jobject jthread)) + JVMWrapper("JVM_GetNativeThreadID"); + oop java_thread = JNIHandles::resolve_non_null(jthread); + JavaThread* thr = java_lang_Thread::thread(java_thread); + if (thr != NULL) { + OSThread *osThread = thr->osthread(); + if (osThread != NULL) { + return (jlong) osThread->thread_id(); + } + } + return 0; +JVM_END + // java.lang.SecurityManager /////////////////////////////////////////////////////////////////////// JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env)) diff --git a/src/java.base/share/classes/java/lang/Thread.java b/src/java.base/share/classes/java/lang/Thread.java --- a/src/java.base/share/classes/java/lang/Thread.java +++ b/src/java.base/share/classes/java/lang/Thread.java @@ -2140,4 +2140,14 @@ private native void resume0(); private native void interrupt0(); private native void setNativeName(String name); + + /** Returns the native thread identifier of this Thread. + * The native thread ID is a platform dependant indentifier for the + * underlying native thread corresponding to the Java Thread. + * If there is no such ID or it is not supported on the current + * platform, 0L is returned instead. + * + * @return this thread's native thread ID. + * @since 11 */ + public native long getNativeThreadId(); } diff --git a/src/java.base/share/native/libjava/Thread.c b/src/java.base/share/native/libjava/Thread.c --- a/src/java.base/share/native/libjava/Thread.c +++ b/src/java.base/share/native/libjava/Thread.c @@ -57,6 +57,7 @@ {"getThreads", "()[" THD, (void *)&JVM_GetAllThreads}, {"dumpThreads", "([" THD ")[[" STE, (void *)&JVM_DumpThreads}, {"setNativeName", "(" STR ")V", (void *)&JVM_SetNativeThreadName}, + {"getNativeThreadId","()J", (void *)&JVM_GetNativeThreadID}, }; #undef THD