< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp

Print this page
rev 55399 : 8225590: Shenandoah: Refactor ShenandoahClassLoaderDataRoots API
rev 55401 : 8225582: Shenandoah: Enable concurrent evacuation of JNIHandles and CLDG roots

@@ -59,13 +59,20 @@
 public:
   ShenandoahSerialRoots();
   void oops_do(OopClosure* cl, uint worker_id);
 };
 
-class ShenandoahJNIHandleRoots : public ShenandoahSerialRoot {
+template <bool CONCURRENT = false>
+class ShenandoahJNIHandleRoots {
+private:
+  volatile bool _claimed;
+  OopStorage::ParState<CONCURRENT, false /* is_const */> _itr;
 public:
   ShenandoahJNIHandleRoots();
+
+  template <typename T>
+  void oops_do(T* cl, uint worker_id = 0);
 };
 
 class ShenandoahThreadRoots {
 private:
   const bool _is_par;

@@ -106,16 +113,18 @@
   ~ShenandoahCodeCacheRoots();
 
   void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
 };
 
+template <bool CONCURRENT = false>
 class ShenandoahClassLoaderDataRoots {
 public:
   ShenandoahClassLoaderDataRoots();
+  ~ShenandoahClassLoaderDataRoots();
 
-  void always_strong_cld_do(CLDClosure* clds, uint worker_id);
-  void cld_do(CLDClosure* clds, uint worker_id);
+  void always_strong_cld_do(CLDClosure* clds, uint worker_id = 0);
+  void cld_do(CLDClosure* clds, uint worker_id = 0);
 };
 
 class ShenandoahRootProcessor : public StackObj {
 private:
   ShenandoahHeap* const               _heap;

@@ -129,12 +138,12 @@
 
 template <typename ITR>
 class ShenandoahRootScanner : public ShenandoahRootProcessor {
 private:
   ShenandoahSerialRoots          _serial_roots;
-  ShenandoahJNIHandleRoots       _jni_roots;
-  ShenandoahClassLoaderDataRoots _cld_roots;
+  ShenandoahJNIHandleRoots<>       _jni_roots;
+  ShenandoahClassLoaderDataRoots<> _cld_roots;
   ShenandoahThreadRoots          _thread_roots;
   ShenandoahCodeCacheRoots<ITR>  _code_roots;
 public:
   ShenandoahRootScanner(uint n_workers, ShenandoahPhaseTimings::Phase phase);
 

@@ -157,29 +166,30 @@
 
 // Evacuate all roots at a safepoint
 class ShenandoahRootEvacuator : public ShenandoahRootProcessor {
 private:
   ShenandoahSerialRoots          _serial_roots;
-  ShenandoahJNIHandleRoots       _jni_roots;
-  ShenandoahClassLoaderDataRoots _cld_roots;
+  ShenandoahJNIHandleRoots<>       _jni_roots;
+  ShenandoahClassLoaderDataRoots<> _cld_roots;
   ShenandoahThreadRoots          _thread_roots;
   ShenandoahWeakRoots            _weak_roots;
   ShenandoahStringDedupRoots     _dedup_roots;
   ShenandoahCodeCacheRoots<ShenandoahCsetCodeRootsIterator> _code_roots;
+  bool                             _include_concurrent_roots;
 
 public:
-  ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase);
+  ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots);
 
   void roots_do(uint worker_id, OopClosure* oops);
 };
 
 // Update all roots at a safepoint
 class ShenandoahRootUpdater : public ShenandoahRootProcessor {
 private:
   ShenandoahSerialRoots          _serial_roots;
-  ShenandoahJNIHandleRoots       _jni_roots;
-  ShenandoahClassLoaderDataRoots _cld_roots;
+  ShenandoahJNIHandleRoots<>       _jni_roots;
+  ShenandoahClassLoaderDataRoots<> _cld_roots;
   ShenandoahThreadRoots          _thread_roots;
   ShenandoahWeakRoots            _weak_roots;
   ShenandoahStringDedupRoots     _dedup_roots;
   ShenandoahCodeCacheRoots<ShenandoahCsetCodeRootsIterator> _code_roots;
   const bool                     _update_code_cache;

@@ -193,12 +203,12 @@
 
 // Adjuster all roots at a safepoint during full gc
 class ShenandoahRootAdjuster : public ShenandoahRootProcessor {
 private:
   ShenandoahSerialRoots          _serial_roots;
-  ShenandoahJNIHandleRoots       _jni_roots;
-  ShenandoahClassLoaderDataRoots _cld_roots;
+  ShenandoahJNIHandleRoots<>       _jni_roots;
+  ShenandoahClassLoaderDataRoots<> _cld_roots;
   ShenandoahThreadRoots          _thread_roots;
   ShenandoahWeakRoots            _weak_roots;
   ShenandoahStringDedupRoots     _dedup_roots;
   ShenandoahCodeCacheRoots<ShenandoahAllCodeRootsIterator> _code_roots;
 
< prev index next >