8188919: Generalize GC thread suspend/resume at safepoints
authoreosterlund
Tue, 17 Oct 2017 08:51:55 +0200
changeset 47636 52d46d7e3454
parent 47635 dfb375d231fb
child 47637 87141990dde5
8188919: Generalize GC thread suspend/resume at safepoints Reviewed-by: pliden, rkennke
src/hotspot/share/gc/cms/cmsHeap.cpp
src/hotspot/share/gc/cms/cmsHeap.hpp
src/hotspot/share/gc/g1/g1CollectedHeap.cpp
src/hotspot/share/gc/g1/g1CollectedHeap.hpp
src/hotspot/share/gc/shared/collectedHeap.hpp
src/hotspot/share/runtime/safepoint.cpp
--- a/src/hotspot/share/gc/cms/cmsHeap.cpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/cms/cmsHeap.cpp	Tue Oct 17 08:51:55 2017 +0200
@@ -134,6 +134,14 @@
   ConcurrentMarkSweepThread::cmst()->stop();
 }
 
+void CMSHeap::safepoint_synchronize_begin() {
+  ConcurrentMarkSweepThread::synchronize(false);
+}
+
+void CMSHeap::safepoint_synchronize_end() {
+  ConcurrentMarkSweepThread::desynchronize(false);
+}
+
 void CMSHeap::cms_process_roots(StrongRootsScope* scope,
                                 bool young_gen_as_roots,
                                 ScanningOption so,
--- a/src/hotspot/share/gc/cms/cmsHeap.hpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/cms/cmsHeap.hpp	Tue Oct 17 08:51:55 2017 +0200
@@ -79,6 +79,8 @@
   }
 
   void stop();
+  void safepoint_synchronize_begin();
+  void safepoint_synchronize_end();
 
   // If "young_gen_as_roots" is false, younger generations are
   // not scanned as roots; in this case, the caller must be arranging to
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp	Tue Oct 17 08:51:55 2017 +0200
@@ -1842,6 +1842,14 @@
   }
 }
 
+void G1CollectedHeap::safepoint_synchronize_begin() {
+  SuspendibleThreadSet::synchronize();
+}
+
+void G1CollectedHeap::safepoint_synchronize_end() {
+  SuspendibleThreadSet::desynchronize();
+}
+
 size_t G1CollectedHeap::conservative_max_heap_alignment() {
   return HeapRegion::max_region_size();
 }
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp	Tue Oct 17 08:51:55 2017 +0200
@@ -968,6 +968,8 @@
   jint initialize();
 
   virtual void stop();
+  virtual void safepoint_synchronize_begin();
+  virtual void safepoint_synchronize_end();
 
   // Return the (conservative) maximum heap alignment for any G1 heap
   static size_t conservative_max_heap_alignment();
--- a/src/hotspot/share/gc/shared/collectedHeap.hpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/shared/collectedHeap.hpp	Tue Oct 17 08:51:55 2017 +0200
@@ -221,6 +221,10 @@
   // Stop any onging concurrent work and prepare for exit.
   virtual void stop() {}
 
+  // Stop and resume concurrent GC threads interfering with safepoint operations
+  virtual void safepoint_synchronize_begin() {}
+  virtual void safepoint_synchronize_end() {}
+
   void initialize_reserved_region(HeapWord *start, HeapWord *end);
   MemRegion reserved_region() const { return _reserved; }
   address base() const { return (address)reserved_region().start(); }
--- a/src/hotspot/share/runtime/safepoint.cpp	Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/runtime/safepoint.cpp	Tue Oct 17 08:51:55 2017 +0200
@@ -63,10 +63,6 @@
 #include "trace/traceMacros.hpp"
 #include "utilities/events.hpp"
 #include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
-#include "gc/cms/concurrentMarkSweepThread.hpp"
-#include "gc/g1/suspendibleThreadSet.hpp"
-#endif // INCLUDE_ALL_GCS
 #ifdef COMPILER1
 #include "c1/c1_globals.hpp"
 #endif
@@ -94,15 +90,7 @@
     _ts_of_current_safepoint = tty->time_stamp().seconds();
   }
 
-#if INCLUDE_ALL_GCS
-  if (UseConcMarkSweepGC) {
-    // In the future we should investigate whether CMS can use the
-    // more-general mechanism below.  DLD (01/05).
-    ConcurrentMarkSweepThread::synchronize(false);
-  } else if (UseG1GC) {
-    SuspendibleThreadSet::synchronize();
-  }
-#endif // INCLUDE_ALL_GCS
+  Universe::heap()->safepoint_synchronize_begin();
 
   // By getting the Threads_lock, we assure that no threads are about to start or
   // exit. It is released again in SafepointSynchronize::end().
@@ -512,14 +500,7 @@
     Threads_lock->unlock();
 
   }
-#if INCLUDE_ALL_GCS
-  // If there are any concurrent GC threads resume them.
-  if (UseConcMarkSweepGC) {
-    ConcurrentMarkSweepThread::desynchronize(false);
-  } else if (UseG1GC) {
-    SuspendibleThreadSet::desynchronize();
-  }
-#endif // INCLUDE_ALL_GCS
+  Universe::heap()->safepoint_synchronize_end();
   // record this time so VMThread can keep track how much time has elapsed
   // since last safepoint.
   _end_of_last_safepoint = os::javaTimeMillis();