< prev index next >

src/hotspot/share/runtime/thread.cpp

Print this page

        

@@ -1309,26 +1309,35 @@
     }
   }
 }
 
 void NonJavaThread::pre_run() {
-  // Initialize BarrierSet-related data before adding to list.
+  {
+    SuspendibleThreadSetJoiner sts(!is_VM_thread() && !is_Worker_thread());
+    add_to_the_list();
+
+    // Initialize BarrierSet-related data after adding to list.
   assert(BarrierSet::barrier_set() != NULL, "invariant");
   BarrierSet::barrier_set()->on_thread_attach(this);
-  add_to_the_list();
+  }
 
   // This is slightly odd in that NamedThread is a subclass, but
   // in fact name() is defined in Thread
   assert(this->name() != NULL, "thread name was not set before it was started");
   this->set_native_thread_name(this->name());
 }
 
 void NonJavaThread::post_run() {
   JFR_ONLY(Jfr::on_thread_exit(this);)
+  {
+    SuspendibleThreadSetJoiner sts(!is_VM_thread() && !is_Worker_thread());
+
   // Clean up BarrierSet data before removing from list.
   BarrierSet::barrier_set()->on_thread_detach(this);
+
   remove_from_the_list();
+  }
   // Ensure thread-local-storage is cleared before termination.
   Thread::clear_thread_current();
 }
 
 // NamedThread --  non-JavaThread subclasses with multiple
< prev index next >