src/share/vm/gc/g1/g1CollectedHeap.cpp

Print this page

        

@@ -1107,39 +1107,34 @@
 void G1CollectedHeap::clear_rsets_post_compaction() {
   PostMCRemSetClearClosure rs_clear(this, g1_barrier_set());
   heap_region_iterate(&rs_clear);
 }
 
-class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
-  G1CollectedHeap*   _g1h;
+class ParRebuildRSTask: public G1ParallelizeByRegionsTask {
+  class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
   UpdateRSOopClosure _cl;
-public:
+  public:
   RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, uint worker_i = 0) :
-    _cl(g1->g1_rem_set(), worker_i),
-    _g1h(g1)
-  { }
+      _cl(g1->g1_rem_set(), worker_i) {}
 
   bool doHeapRegion(HeapRegion* r) {
     if (!r->is_continues_humongous()) {
       _cl.set_from(r);
       r->oop_iterate(&_cl);
     }
     return false;
   }
-};
-
-class ParRebuildRSTask: public AbstractGangTask {
-  G1CollectedHeap* _g1;
-  HeapRegionClaimer _hrclaimer;
+  };
 
 public:
   ParRebuildRSTask(G1CollectedHeap* g1) :
-      AbstractGangTask("ParRebuildRSTask"), _g1(g1), _hrclaimer(g1->workers()->active_workers()) {}
+      G1ParallelizeByRegionsTask("ParRebuildRSTask", g1->workers()->active_workers()) {}
 
   void work(uint worker_id) {
-    RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
-    _g1->heap_region_par_iterate(&rebuild_rs, worker_id, &_hrclaimer);
+    G1CollectedHeap* g1 = G1CollectedHeap::heap();
+    RebuildRSOutOfRegionClosure rebuild_rs(g1, worker_id);
+    all_heap_regions_work(&rebuild_rs, worker_id);
   }
 };
 
 class PostCompactionPrinterClosure: public HeapRegionClosure {
 private:

@@ -4598,30 +4593,39 @@
 
 void G1CollectedHeap::decrement_summary_bytes(size_t bytes) {
   decrease_used(bytes);
 }
 
-class G1ParScrubRemSetTask: public AbstractGangTask {
-protected:
-  G1RemSet* _g1rs;
-  HeapRegionClaimer _hrclaimer;
+class G1ParScrubRemSetTask: public G1ParallelizeByRegionsTask {
+  class G1ScrubRSClosure: public HeapRegionClosure {
+    G1CardLiveData* _live_data;
+  public:
+    G1ScrubRSClosure(G1CardLiveData* live_data) :
+      _live_data(live_data) {}
 
-public:
-  G1ParScrubRemSetTask(G1RemSet* g1_rs, uint num_workers) :
-    AbstractGangTask("G1 ScrubRS"),
-    _g1rs(g1_rs),
-    _hrclaimer(num_workers) {
+    bool doHeapRegion(HeapRegion* r) {
+      if (!r->is_continues_humongous()) {
+        r->rem_set()->scrub(_live_data);
   }
+      return false;
+    }
+  };
+
+public:
+  G1ParScrubRemSetTask(uint num_workers) :
+    G1ParallelizeByRegionsTask("G1 ScrubRS", num_workers) {}
 
   void work(uint worker_id) {
-    _g1rs->scrub(worker_id, &_hrclaimer);
+    G1CollectedHeap* g1 = G1CollectedHeap::heap(); 
+    G1ScrubRSClosure scrub_cl(&g1->g1_rem_set()->_card_live_data);
+    all_heap_regions_work(&scrub_cl, worker_id);
   }
 };
 
 void G1CollectedHeap::scrub_rem_set() {
   uint num_workers = workers()->active_workers();
-  G1ParScrubRemSetTask g1_par_scrub_rs_task(g1_rem_set(), num_workers);
+  G1ParScrubRemSetTask g1_par_scrub_rs_task(num_workers);
   workers()->run_task(&g1_par_scrub_rs_task);
 }
 
 class G1FreeCollectionSetTask : public AbstractGangTask {
 private: