src/share/vm/gc_implementation/g1/heapRegionManager.hpp

Print this page
rev 7056 : [mq]: 8058298
rev 7057 : imported patch review

@@ -29,10 +29,11 @@
 #include "gc_implementation/g1/g1RegionToSpaceMapper.hpp"
 #include "gc_implementation/g1/heapRegionSet.hpp"
 
 class HeapRegion;
 class HeapRegionClosure;
+class HeapRegionClaimer;
 class FreeRegionList;
 
 class G1HeapRegionTable : public G1BiasedMappedArray<HeapRegion*> {
  protected:
   virtual HeapRegion* default_value() const { return NULL; }

@@ -231,7 +232,46 @@
 
   // Do some sanity checking.
   void verify_optional() PRODUCT_RETURN;
 };
 
+// The HeapRegionClaimer is used during parallel iteration over heap regions,
+// allowing workers to claim heap regions, gaining exclusive rights to these regions.
+class HeapRegionClaimer : public StackObj {
+  uint  _n_workers;
+  uint  _n_regions;
+  uint* _claims;
+
+  static const uint Unclaimed = 0;
+  static const uint Claimed   = 1;
+
+ public:
+  HeapRegionClaimer() : _n_workers(0), _n_regions(0), _claims(NULL) {}
+
+  HeapRegionClaimer(uint n_workers) : _n_workers(n_workers), _n_regions(0), _claims(NULL) {
+    initialize(n_workers);
+  }
+
+  ~HeapRegionClaimer() {
+    if (_claims != NULL) {
+      FREE_C_HEAP_ARRAY(uint, _claims, mtGC);
+    }
+  }
+
+  inline uint n_regions() const {
+    return _n_regions;
+  }
+
+  void initialize(uint n_workers);
+
+  // Calculate the starting region for given worker so
+  // that they do not all start from the same region.
+  uint start_region_for_worker(uint worker_id) const;
+
+  // Check if region has been claimed with this HRClaimer.
+  bool is_region_claimed(uint region_index) const;
+
+  // Claim the given region, returns true if successfully claimed.
+  bool claim_region(uint region_index);
+};
 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONMANAGER_HPP