8185580: Refactor Threads::possibly_parallel_oops_do() to use Threads::parallel_java_threads_do()
authorrkennke
Tue, 17 Oct 2017 18:54:03 +0200
changeset 47637 87141990dde5
parent 47636 52d46d7e3454
child 47638 cccfa7339755
child 47639 ad6a219f8b95
child 47642 aeb80739a5ca
8185580: Refactor Threads::possibly_parallel_oops_do() to use Threads::parallel_java_threads_do() Reviewed-by: dholmes, coleenp
src/hotspot/share/runtime/safepoint.cpp
src/hotspot/share/runtime/thread.cpp
src/hotspot/share/runtime/thread.hpp
--- a/src/hotspot/share/runtime/safepoint.cpp	Tue Oct 17 08:51:55 2017 +0200
+++ b/src/hotspot/share/runtime/safepoint.cpp	Tue Oct 17 18:54:03 2017 +0200
@@ -563,7 +563,7 @@
 
   void work(uint worker_id) {
     // All threads deflate monitors and mark nmethods (if necessary).
-    Threads::parallel_java_threads_do(&_cleanup_threads_cl);
+    Threads::possibly_parallel_threads_do(true, &_cleanup_threads_cl);
 
     if (!_subtasks.is_task_claimed(SafepointSynchronize::SAFEPOINT_CLEANUP_DEFLATE_MONITORS)) {
       const char* name = "deflating idle monitors";
--- a/src/hotspot/share/runtime/thread.cpp	Tue Oct 17 08:51:55 2017 +0200
+++ b/src/hotspot/share/runtime/thread.cpp	Tue Oct 17 18:54:03 2017 +0200
@@ -3349,20 +3349,17 @@
   // If CompilerThreads ever become non-JavaThreads, add them here
 }
 
-void Threads::parallel_java_threads_do(ThreadClosure* tc) {
+void Threads::possibly_parallel_threads_do(bool is_par, ThreadClosure* tc) {
   int cp = Threads::thread_claim_parity();
   ALL_JAVA_THREADS(p) {
-    if (p->claim_oops_do(true, cp)) {
+    if (p->claim_oops_do(is_par, cp)) {
       tc->do_thread(p);
     }
   }
-  // Thread claiming protocol requires us to claim the same interesting
-  // threads on all paths. Notably, Threads::possibly_parallel_threads_do
-  // claims all Java threads *and* the VMThread. To avoid breaking the
-  // claiming protocol, we have to claim VMThread on this path too, even
-  // if we do not apply the closure to the VMThread.
   VMThread* vmt = VMThread::vm_thread();
-  (void)vmt->claim_oops_do(true, cp);
+  if (vmt->claim_oops_do(is_par, cp)) {
+    tc->do_thread(vmt);
+  }
 }
 
 // The system initialization in the library has three phases.
@@ -4324,17 +4321,20 @@
 }
 #endif // ASSERT
 
+class ParallelOopsDoThreadClosure : public ThreadClosure {
+private:
+  OopClosure* _f;
+  CodeBlobClosure* _cf;
+public:
+  ParallelOopsDoThreadClosure(OopClosure* f, CodeBlobClosure* cf) : _f(f), _cf(cf) {}
+  void do_thread(Thread* t) {
+    t->oops_do(_f, _cf);
+  }
+};
+
 void Threads::possibly_parallel_oops_do(bool is_par, OopClosure* f, CodeBlobClosure* cf) {
-  int cp = Threads::thread_claim_parity();
-  ALL_JAVA_THREADS(p) {
-    if (p->claim_oops_do(is_par, cp)) {
-      p->oops_do(f, cf);
-    }
-  }
-  VMThread* vmt = VMThread::vm_thread();
-  if (vmt->claim_oops_do(is_par, cp)) {
-    vmt->oops_do(f, cf);
-  }
+  ParallelOopsDoThreadClosure tc(f, cf);
+  possibly_parallel_threads_do(is_par, &tc);
 }
 
 #if INCLUDE_ALL_GCS
--- a/src/hotspot/share/runtime/thread.hpp	Tue Oct 17 08:51:55 2017 +0200
+++ b/src/hotspot/share/runtime/thread.hpp	Tue Oct 17 18:54:03 2017 +0200
@@ -2052,7 +2052,7 @@
   static bool includes(JavaThread* p);
   static JavaThread* first()                     { return _thread_list; }
   static void threads_do(ThreadClosure* tc);
-  static void parallel_java_threads_do(ThreadClosure* tc);
+  static void possibly_parallel_threads_do(bool is_par, ThreadClosure* tc);
 
   // Initializes the vm and creates the vm thread
   static jint create_vm(JavaVMInitArgs* args, bool* canTryAgain);