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