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

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

*** 29,38 **** --- 29,39 ---- #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,237 **** --- 232,277 ---- // 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