< prev index next >

src/hotspot/share/runtime/threadSMR.cpp

Print this page
rev 56552 : imported patch 8218543-2

@@ -526,10 +526,26 @@
   if (ThreadsSMRSupport::is_bootstrap_list(_list)) {
     // We are early in VM bootstrapping so nothing to do here.
     return;
   }
 
+  if ( _thread == VM_Exit::shutdown_thread()) {
+    // The shutdown thread has removed itself from the Threads
+    // list and is safe to have a waiver from this check because
+    // VM_Exit::_shutdown_thread is not set until after the VMThread
+    // has started the final safepoint which holds the Threads_lock
+    // for the remainder of the VM's life.
+    return;
+  }
+
+  if (VMError::is_error_reported() &&
+      VMError::get_first_error_tid() == os::current_thread_id()) {
+    // If there is an error reported by this thread it may use ThreadsList even
+    // if it's unsafe.
+    return;
+  }
+
   // The closure will attempt to verify that the calling thread can
   // be found by threads_do() on the specified ThreadsList. If it
   // is successful, then the specified ThreadsList was acquired as
   // a stable hazard ptr by the calling thread in a way that honored
   // the Thread-SMR protocol.

@@ -538,26 +554,20 @@
   // it is not the shutdown thread, then the calling thread is not
   // honoring the Thread-SMR ptotocol. This means that the specified
   // ThreadsList is not a stable hazard ptr and can be freed by
   // another thread from the to-be-deleted list at any time.
   //
-  // Note: The shutdown thread has removed itself from the Threads
-  // list and is safe to have a waiver from this check because
-  // VM_Exit::_shutdown_thread is not set until after the VMThread
-  // has started the final safepoint which holds the Threads_lock
-  // for the remainder of the VM's life.
-  //
   VerifyHazardPtrThreadClosure cl(_thread);
   ThreadsSMRSupport::threads_do(&cl, _list);
 
   // If the calling thread is not honoring the Thread-SMR protocol,
   // then we will either crash in threads_do() above because 'threads'
   // was freed by another thread or we will fail the assert() below.
   // In either case, we won't get past this point with a badly placed
   // ThreadsListHandle.
 
-  assert(cl.found() || _thread == VM_Exit::shutdown_thread(), "Acquired a ThreadsList snapshot from a thread not recognized by the Thread-SMR protocol.");
+  assert(cl.found(), "Acquired a ThreadsList snapshot from a thread not recognized by the Thread-SMR protocol.");
 #endif
 }
 
 // 'entries + 1' so we always have at least one entry.
 ThreadsList::ThreadsList(int entries) :
< prev index next >