< prev index next >
src/share/vm/prims/unsafe.cpp
Print this page
@@ -1287,13 +1287,16 @@
UNSAFE_END
UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread))
UnsafeWrapper("Unsafe_Unpark");
Parker* p = NULL;
+ oop java_thread = NULL;
+ JavaThread* thr = NULL;
if (jthread != NULL) {
- oop java_thread = JNIHandles::resolve_non_null(jthread);
+ java_thread = JNIHandles::resolve_non_null(jthread);
if (java_thread != NULL) {
+ thr = java_lang_Thread::thread(java_thread);
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
@@ -1301,29 +1304,29 @@
} 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);
+ 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) {
+ if (p != NULL && thr != NULL) {
#ifndef USDT2
HS_DTRACE_PROBE1(hotspot, thread__unpark, p);
#else /* USDT2 */
HOTSPOT_THREAD_UNPARK(
(uintptr_t) p);
#endif /* USDT2 */
- p->unpark();
+ p->unpark(thr);
}
UNSAFE_END
UNSAFE_ENTRY(jint, Unsafe_Loadavg(JNIEnv *env, jobject unsafe, jdoubleArray loadavg, jint nelem))
UnsafeWrapper("Unsafe_Loadavg");
< prev index next >