< prev index next >

src/hotspot/share/prims/unsafe.cpp

Print this page
rev 47287 : Port 09.17.Thread_SMR_logging_update from JDK9 to JDK10
rev 47288 : sspitsyn, dcubed, eosterlund CR - minor changes prior to OpenJDK review.
rev 47289 : eosterlund, stefank CR - refactor code into threadSMR.cpp and threadSMR.hpp

*** 36,45 **** --- 36,47 ---- #include "runtime/atomic.hpp" #include "runtime/globals.hpp" #include "runtime/interfaceSupport.hpp" #include "runtime/orderAccess.inline.hpp" #include "runtime/reflection.hpp" + #include "runtime/thread.hpp" + #include "runtime/threadSMR.hpp" #include "runtime/vm_version.hpp" #include "services/threadService.hpp" #include "trace/tracing.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp"
*** 1102,1136 **** UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread)) { Parker* p = NULL; if (jthread != NULL) { ! oop java_thread = JNIHandles::resolve_non_null(jthread); if (java_thread != NULL) { jlong lp = java_lang_Thread::park_event(java_thread); if (lp != 0) { // This cast is OK even though the jlong might have been read // non-atomically on 32bit systems, since there, one word will // always be zero anyway and the value set is always the same p = (Parker*)addr_from_java(lp); } else { ! // Grab lock if apparently null or using older version of library ! MutexLocker mu(Threads_lock); ! java_thread = JNIHandles::resolve_non_null(jthread); ! ! if (java_thread != NULL) { ! JavaThread* thr = java_lang_Thread::thread(java_thread); if (thr != NULL) { p = thr->parker(); ! if (p != NULL) { // Bind to Java thread for next time. java_lang_Thread::set_park_event(java_thread, addr_to_java(p)); } } } } ! } ! } if (p != NULL) { HOTSPOT_THREAD_UNPARK((uintptr_t) p); p->unpark(); } --- 1104,1139 ---- UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread)) { Parker* p = NULL; if (jthread != NULL) { ! ThreadsListHandle tlh; ! JavaThread* thr = NULL; ! oop java_thread = NULL; ! (void) tlh.cv_internal_thread_to_JavaThread(jthread, &thr, &java_thread); if (java_thread != NULL) { + // This is a valid oop. jlong lp = java_lang_Thread::park_event(java_thread); if (lp != 0) { // This cast is OK even though the jlong might have been read // non-atomically on 32bit systems, since there, one word will // always be zero anyway and the value set is always the same p = (Parker*)addr_from_java(lp); } else { ! // Not cached in the java.lang.Thread oop yet (could be an ! // older version of library). if (thr != NULL) { + // The JavaThread is alive. p = thr->parker(); ! if (p != NULL) { ! // Cache the Parker in the java.lang.Thread oop for next time. java_lang_Thread::set_park_event(java_thread, addr_to_java(p)); } } } } ! } // ThreadsListHandle is destroyed here. if (p != NULL) { HOTSPOT_THREAD_UNPARK((uintptr_t) p); p->unpark(); }
< prev index next >