< prev index next >

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

Print this page
rev 54809 : 8223215: Shenandoah: Support verifying subset of roots
rev 54810 : 8223774: Shenandoah: Refactor ShenandoahRootProcessor and family

@@ -34,112 +34,159 @@
 #include "gc/shared/weakProcessorPhaseTimes.hpp"
 #include "gc/shared/workgroup.hpp"
 #include "memory/allocation.hpp"
 #include "memory/iterator.hpp"
 
-class ParallelCLDRootIterator {
+class ShenandoahSerialRoot {
 public:
-  ParallelCLDRootIterator();
-  void root_cld_do(CLDClosure* strong, CLDClosure* weak);
+  typedef void (*OopsDo)(OopClosure*);
+private:
+  volatile bool                       _claimed;
+  OopsDo                              _oops_do;
+  ShenandoahPhaseTimings::GCParPhases _phase;
+
+public:
+  ShenandoahSerialRoot(OopsDo oops_do, ShenandoahPhaseTimings::GCParPhases);
+  void oops_do(OopClosure* cl, uint worker_id);
+};
+
+class ShenandoahSerialRoots {
+private:
+  ShenandoahSerialRoot  _universe_root;
+  ShenandoahSerialRoot  _object_synchronizer_root;
+  ShenandoahSerialRoot  _management_root;
+  ShenandoahSerialRoot  _system_dictionary_root;
+  ShenandoahSerialRoot  _jvmti_root;
+  ShenandoahSerialRoot  _jni_handle_root;
+public:
+  ShenandoahSerialRoots();
+  void oops_do(OopClosure* cl, uint worker_id);
+};
+
+class ShenandoahThreadRoots {
+private:
+  bool _is_par;
+public:
+  ShenandoahThreadRoots(bool is_par);
+  ~ShenandoahThreadRoots();
+
+  void oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id);
+  void threads_do(ThreadClosure* tc, uint worker_id);
+};
+
+class ShenandoahWeakRoots {
+private:
+  WeakProcessorPhaseTimes _process_timings;
+  WeakProcessor::Task     _task;
+public:
+  ShenandoahWeakRoots(uint n_workers);
+  ~ShenandoahWeakRoots();
+
+  template <typename IsAlive, typename KeepAlive>
+  void oops_do(IsAlive* is_alive, KeepAlive* keep_alive, uint worker_id);
+};
+
+class ShenandoahStringDedupRoot {
+public:
+  ShenandoahStringDedupRoot();
+  ~ShenandoahStringDedupRoot();
+
+  void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
+};
+
+template <typename ITR>
+class ShenandoahCodeCacheRoot {
+private:
+  ITR _coderoots_iterator;
+public:
+  ShenandoahCodeCacheRoot();
+  ~ShenandoahCodeCacheRoot();
+
+  void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
 };
 
-enum Shenandoah_process_roots_tasks {
-  SHENANDOAH_RP_PS_Universe_oops_do,
-  SHENANDOAH_RP_PS_JNIHandles_oops_do,
-  SHENANDOAH_RP_PS_ObjectSynchronizer_oops_do,
-  SHENANDOAH_RP_PS_Management_oops_do,
-  SHENANDOAH_RP_PS_SystemDictionary_oops_do,
-  SHENANDOAH_RP_PS_jvmti_oops_do,
-  // Leave this one last.
-  SHENANDOAH_RP_PS_NumElements
+class ShenandoahClassLoaderDataRoot {
+public:
+  ShenandoahClassLoaderDataRoot();
+
+  void clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id);
 };
 
 class ShenandoahRootProcessor : public StackObj {
-  SubTasksDone* _process_strong_tasks;
-  StrongRootsScope _srs;
+private:
+  ShenandoahSerialRoots         _serial_roots;
+  ShenandoahClassLoaderDataRoot _cld_roots;
+  ShenandoahThreadRoots         _thread_roots;
+  ShenandoahCodeCacheRoot<ShenandoahAllCodeRootsIterator> _code_roots;
   ShenandoahPhaseTimings::Phase _phase;
-  ParallelCLDRootIterator _cld_iterator;
-  ShenandoahAllCodeRootsIterator _coderoots_all_iterator;
-  CodeBlobClosure* _threads_nmethods_cl;
-  WeakProcessorPhaseTimes _weak_processor_timings;
-  WeakProcessor::Task     _weak_processor_task;
-  bool                    _processed_weak_roots;
-
-  void process_java_roots(OopClosure* scan_non_heap_roots,
-                          CLDClosure* scan_strong_clds,
-                          CLDClosure* scan_weak_clds,
-                          CodeBlobClosure* scan_strong_code,
-                          ThreadClosure* thread_cl,
-                          uint worker_i);
-
-  void process_vm_roots(OopClosure* scan_non_heap_roots,
-                        uint worker_i);
-
-  void weak_processor_timing_to_shenandoah_timing(const WeakProcessorPhases::Phase wpp,
-                                                  const ShenandoahPhaseTimings::GCParPhases spp,
-                                                  ShenandoahWorkerTimings* worker_times) const;
-
 public:
-  ShenandoahRootProcessor(ShenandoahHeap* heap, uint n_workers,
-                          ShenandoahPhaseTimings::Phase phase);
+  ShenandoahRootProcessor(uint n_workers, ShenandoahPhaseTimings::Phase phase);
   ~ShenandoahRootProcessor();
 
-  // Apply oops, clds and blobs to all strongly reachable roots in the system.
-  // Optionally, apply class loader closure to weak clds, depending on class unloading
-  // for the particular GC cycles.
-  void process_strong_roots(OopClosure* oops,
-                            CLDClosure* clds,
-                            CodeBlobClosure* blobs,
-                            ThreadClosure* thread_cl,
-                            uint worker_id);
-
-  // Apply oops, clds and blobs to strongly reachable roots in the system
-  void process_all_roots(OopClosure* oops,
-                         CLDClosure* clds,
-                         CodeBlobClosure* blobs,
-                         ThreadClosure* thread_cl,
-                         uint worker_id);
-
-  // Apply oops, clds and blobs to strongly and weakly reachable roots in the system
-  template <typename IsAlive>
-  void update_all_roots(OopClosure* oops,
-                        CLDClosure* clds,
-                        CodeBlobClosure* blobs,
-                        ThreadClosure* thread_cl,
-                        uint worker_id);
-
-  // Number of worker threads used by the root processor.
-  uint n_workers() const;
+  // Apply oops, clds and blobs to all strongly reachable roots in the system,
+  // during class unloading cycle
+  void strong_roots_do(uint worker_id, OopClosure* cl);
+  void strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc = NULL);
+
+  // Apply oops, clds and blobs to all strongly reachable roots and weakly reachable
+  // roots when class unloading is disabled during this cycle
+  void roots_do(uint worker_id, OopClosure* cl);
+  void roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc = NULL);
 };
 
+// Evacuate all roots at a safepoint
 class ShenandoahRootEvacuator : public StackObj {
-  SubTasksDone* _evacuation_tasks;
-  StrongRootsScope _srs;
+private:
+  ShenandoahSerialRoots         _serial_roots;
+  ShenandoahClassLoaderDataRoot _cld_roots;
+  ShenandoahThreadRoots         _thread_roots;
+  ShenandoahWeakRoots           _weak_roots;
+  ShenandoahStringDedupRoot     _dedup_roots;
+  ShenandoahCodeCacheRoot<ShenandoahCsetCodeRootsIterator> _code_roots;
   ShenandoahPhaseTimings::Phase _phase;
-  ShenandoahCsetCodeRootsIterator _coderoots_cset_iterator;
-  ParallelCLDRootIterator _cld_iterator;
-  WeakProcessorPhaseTimes _weak_processor_timings;
-  WeakProcessor::Task     _weak_processor_task;
-
-  enum Shenandoah_evacuate_roots_tasks {
-    SHENANDOAH_EVAC_Universe_oops_do,
-    SHENANDOAH_EVAC_ObjectSynchronizer_oops_do,
-    SHENANDOAH_EVAC_Management_oops_do,
-    SHENANDOAH_EVAC_SystemDictionary_oops_do,
-    SHENANDOAH_EVAC_jvmti_oops_do,
-    SHENANDOAH_EVAC_JNIHandles_oops_do,
-    // Leave this one last.
-    SHENANDOAH_EVAC_NumElements
-  };
+
 public:
-  ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers,
-                          ShenandoahPhaseTimings::Phase phase);
+  ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase);
   ~ShenandoahRootEvacuator();
 
-  void process_evacuate_roots(OopClosure* oops,
-                              CodeBlobClosure* blobs,
-                              uint worker_id);
+  void roots_do(uint worker_id, OopClosure* oops);
+};
+
+// Update all roots at a safepoint
+class ShenandoahRootUpdater : public StackObj {
+private:
+  ShenandoahSerialRoots         _serial_roots;
+  ShenandoahClassLoaderDataRoot _cld_roots;
+  ShenandoahThreadRoots         _thread_roots;
+  ShenandoahWeakRoots           _weak_roots;
+  ShenandoahStringDedupRoot     _dedup_roots;
+  ShenandoahCodeCacheRoot<ShenandoahCsetCodeRootsIterator> _code_roots;
+  ShenandoahPhaseTimings::Phase _phase;
+  bool                          _update_code_cache;
 
-  // Number of worker threads used by the root processor.
-  uint n_workers() const;
+public:
+  ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache);
+  ~ShenandoahRootUpdater();
+
+  template<typename IsAlive, typename KeepAlive>
+  void roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive);
 };
+
+// Adjuster all roots at a safepoint during full gc
+class ShenandoahRootAdjuster : public StackObj {
+private:
+  ShenandoahSerialRoots         _serial_roots;
+  ShenandoahClassLoaderDataRoot _cld_roots;
+  ShenandoahThreadRoots         _thread_roots;
+  ShenandoahWeakRoots           _weak_roots;
+  ShenandoahStringDedupRoot     _dedup_roots;
+  ShenandoahCodeCacheRoot<ShenandoahAllCodeRootsIterator> _code_roots;
+  ShenandoahPhaseTimings::Phase _phase;
+
+public:
+  ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase);
+  ~ShenandoahRootAdjuster();
+
+  void roots_do(uint worker_id, OopClosure* oops);
+};
+
 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_HPP
< prev index next >