src/share/vm/gc_implementation/g1/heapRegionManager.cpp
Print this page
rev 7056 : [mq]: 8058298
rev 7057 : imported patch review
@@ -437,5 +437,34 @@
void HeapRegionManager::verify_optional() {
verify();
}
#endif // PRODUCT
+void HeapRegionClaimer::initialize(uint n_workers) {
+ assert(n_workers > 0, "Need at least one worker.");
+ assert(_claims == NULL, "Must initialize only once.");
+ _n_workers = n_workers;
+ _n_regions = G1CollectedHeap::heap()->_hrm._allocated_heapregions_length;
+ _claims = NEW_C_HEAP_ARRAY(uint, _n_regions, mtGC);
+ memset(_claims, Unclaimed, sizeof(*_claims) * _n_regions);
+}
+
+uint HeapRegionClaimer::start_region_for_worker(uint worker_id) const {
+ assert(_n_workers != 0, "Must initialize before use.");
+ assert(worker_id < _n_workers, "Invalid worker_id.");
+ return _n_regions * worker_id / _n_workers;
+}
+
+bool HeapRegionClaimer::is_region_claimed(uint region_index) const {
+ assert(_claims != NULL, "Must initialize before use.");
+ assert(region_index < _n_regions, "Invalid index.");
+ return _claims[region_index] == Claimed;
+}
+
+bool HeapRegionClaimer::claim_region(uint region_index) {
+ assert(_claims != NULL, "Must initialize before use.");
+ assert(region_index < _n_regions, "Invalid index.");
+ if (Atomic::cmpxchg(Claimed, &_claims[region_index], Unclaimed) == Unclaimed) {
+ return true;
+ }
+ return false;
+}
\ No newline at end of file