< prev index next >

src/hotspot/share/runtime/thread.hpp

Print this page
rev 57232 : v2.00 -> v2.08 (CR8/v2.08/11-for-jdk14) patches combined into one; merge with jdk-14+25 snapshot; merge with jdk-14+26 snapshot.
rev 57233 : See CR8-to-CR9-changes; merge with 8230876.patch (2019.11.15); merge with jdk-14+25 snapshot; fuzzy merge with jdk-14+26 snapshot.

@@ -524,11 +524,10 @@
   void set_native_thread_name(const char *name) {
     assert(Thread::current() == this, "set_native_thread_name can only be called on the current thread");
     os::set_native_thread_name(name);
   }
 
-  ObjectMonitor** om_in_use_list_addr()          { return (ObjectMonitor **)&om_in_use_list; }
   Monitor* SR_lock() const                       { return _SR_lock; }
 
   bool has_async_exception() const { return (_suspend_flags & _has_async_exception) != 0; }
 
   inline void set_suspend_flag(SuspendFlags f);

@@ -623,29 +622,53 @@
   int vm_operation_ticket()                      { return ++_vm_operation_started_count; }
   int vm_operation_completed_count()             { return _vm_operation_completed_count; }
   void increment_vm_operation_completed_count()  { _vm_operation_completed_count++; }
 
   // For tracking the heavyweight monitor the thread is pending on.
-  ObjectMonitor* current_pending_monitor() {
-    return _current_pending_monitor;
+  ObjectMonitor* current_pending_monitor(ObjectMonitorHandle* omh_p) {
+    if (omh_p->set_om_ptr_if_safe(_current_pending_monitor)) {
+      return omh_p->om_ptr();  // Return the safe ObjectMonitor*.
+    }
+    return NULL;
   }
   void set_current_pending_monitor(ObjectMonitor* monitor) {
+    ObjectMonitor* saved_cur = NULL;
+    if (monitor != NULL) {
+      monitor->inc_ref_count();  // Protect the ObjectMonitor* we're about to cache.
+    } else {
+      saved_cur = _current_pending_monitor;
+    }
     _current_pending_monitor = monitor;
+    if (saved_cur != NULL) {
+      saved_cur->dec_ref_count();  // Cleared the cached ObjectMonitor*.
+    }
   }
   void set_current_pending_monitor_is_from_java(bool from_java) {
     _current_pending_monitor_is_from_java = from_java;
   }
   bool current_pending_monitor_is_from_java() {
     return _current_pending_monitor_is_from_java;
   }
 
   // For tracking the ObjectMonitor on which this thread called Object.wait()
-  ObjectMonitor* current_waiting_monitor() {
-    return _current_waiting_monitor;
+  ObjectMonitor* current_waiting_monitor(ObjectMonitorHandle* omh_p) {
+    if (omh_p->set_om_ptr_if_safe(_current_waiting_monitor)) {
+      return omh_p->om_ptr();  // Return the safe ObjectMonitor*.
+    }
+    return NULL;
   }
   void set_current_waiting_monitor(ObjectMonitor* monitor) {
+    ObjectMonitor* saved_cur = NULL;
+    if (monitor != NULL) {
+      monitor->inc_ref_count();  // Protect the ObjectMonitor* we're about to cache.
+    } else {
+      saved_cur = _current_waiting_monitor;
+    }
     _current_waiting_monitor = monitor;
+    if (saved_cur != NULL) {
+      saved_cur->dec_ref_count();  // Cleared the cached ObjectMonitor*.
+    }
   }
 
   // For tracking the Jvmti raw monitor the thread is pending on.
   JvmtiRawMonitor* current_pending_raw_monitor() {
     return _current_pending_raw_monitor;
< prev index next >