< prev index next >

src/hotspot/share/gc/g1/g1ConcurrentMarkThread.hpp

Print this page
rev 60598 : imported patch 8247928-refactor-concurrent-mark-thread

@@ -35,26 +35,55 @@
 class G1ConcurrentMarkThread: public ConcurrentGCThread {
   friend class VMStructs;
 
   double _vtime_start;  // Initial virtual time.
   double _vtime_accum;  // Accumulated virtual time.
-  double _vtime_mark_accum;
 
   G1ConcurrentMark* _cm;
 
-  enum State {
+  enum ServiceState {
     Idle,
     Started,
     InProgress
   };
 
-  volatile State _state;
+  volatile ServiceState _state;
 
-  void sleep_before_next_cycle();
-  // Delay marking to meet MMU.
-  void delay_to_keep_mmu(G1Policy* g1_policy, bool remark);
-  double mmu_delay_end(G1Policy* g1_policy, bool remark);
+  // Wait for next cycle. Returns true if we should stop the service.
+  bool wait_for_next_cycle();
+
+  // Phases for the full concurrent marking cycle in order.
+  //
+  // We have to ensure that we finish scanning the root regions
+  // before the next GC takes place. To ensure this we have to
+  // make sure that we do not join the STS until the root regions
+  // have been scanned. If we did then it's possible that a
+  // subsequent GC could block us from joining the STS and proceed
+  // without the root regions have been scanned which would be a
+  // correctness issue.
+  // ConcurrentGCBreakpoints must not be placed before the the root
+  // region scan phase too for this reason.
+  bool phase_concurrent_cycle_start();
+  bool phase_clear_cld_claimed_marks();
+  bool phase_scan_root_regions();
+  bool phase_mark_from_roots();
+  bool phase_preclean();
+  bool phase_delay_to_keep_mmu_before_remark();
+  bool phase_remark(bool& has_overflown);
+  bool phase_rebuild_remembered_sets();
+  bool phase_delay_to_keep_mmu_before_cleanup();
+  bool phase_cleanup();
+  bool phase_clear_bitmap_for_next_mark();
+
+  void concurrent_cycle_start();
+  // Perform a full concurrent cycle.
+  void full_concurrent_cycle_do();
+  void concurrent_cycle_end();
+
+  // Delay pauses to meet MMU.
+  void delay_to_keep_mmu(bool remark);
+  double mmu_delay_end(G1Policy* policy, bool remark);
 
   void run_service();
   void stop_service();
 
  public:
< prev index next >