diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp index 9f1bbf1b48e..3a086d8b09b 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp @@ -33,7 +33,6 @@ #include "gc/g1/g1ParScanThreadState.hpp" #include "gc/g1/g1Policy.hpp" #include "logging/logStream.hpp" -#include "runtime/orderAccess.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" @@ -128,8 +127,11 @@ void G1CollectionSet::add_old_region(G1HeapRegion* hr) { _g1h->register_old_collection_set_region_with_region_attr(hr); - assert(num_regions() < _max_num_regions, "Collection set now larger than maximum size."); - _regions[_num_regions++] = hr->hrm_index(); + uint local_num_regions = num_regions(); + assert(local_num_regions < _max_num_regions, "Collection set now larger than maximum size."); + _regions[local_num_regions] = hr->hrm_index(); + _num_regions.store_relaxed(local_num_regions + 1); + _num_initial_old_regions++; _g1h->old_set_remove(hr); @@ -162,14 +164,13 @@ void G1CollectionSet::stop_incremental_building() { void G1CollectionSet::clear() { assert_at_safepoint_on_vm_thread(); - _num_regions = 0; + _num_regions.store_relaxed(0); _groups.clear(); assert(_optional_groups.length() == 0, "must be"); } void G1CollectionSet::iterate(G1HeapRegionClosure* cl) const { - uint len = _num_regions; - OrderAccess::loadload(); + uint len = _num_regions.load_acquire(); for (uint i = 0; i < len; i++) { G1HeapRegion* r = _g1h->region_at(_regions[i]); @@ -233,8 +234,7 @@ void G1CollectionSet::add_young_region_common(G1HeapRegion* hr) { _regions[index] = hr->hrm_index(); // Concurrent readers must observe the store of the value in the array before an // update to the _num_regions field. - OrderAccess::storestore(); - _num_regions++; + _num_regions.fetch_then_add(1u, memory_order_release); } void G1CollectionSet::add_survivor_regions(G1HeapRegion* hr) { diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.hpp b/src/hotspot/share/gc/g1/g1CollectionSet.hpp index 5fa9868f2b2..eee985f259d 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.hpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.hpp @@ -26,6 +26,7 @@ #define SHARE_GC_G1_G1COLLECTIONSET_HPP #include "gc/g1/g1CollectionSetCandidates.hpp" +#include "runtime/atomic.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" @@ -142,14 +143,14 @@ class G1CollectionSet { // All regions in _regions below _num_regions are assumed to be part of the // collection set. // We assume that at any time there is at most only one writer and (one or more) - // concurrent readers. This means synchronization using storestore and loadload - // barriers on the writer and reader respectively only are sufficient. + // concurrent readers. This means synchronization using release and acquire + // on the writer and reader respectively only are sufficient. // // This corresponds to the regions referenced by the candidate groups further below. uint* _regions; uint _max_num_regions; - volatile uint _num_regions; + Atomic _num_regions; // Old gen groups selected for evacuation. G1CSetCandidateGroupList _groups; @@ -285,7 +286,7 @@ public: // Returns the number of regions in the current collection set increment. uint num_regions_in_increment() const { return num_regions() - _regions_inc_part_start; } // Returns the total number of regions in the current collection set. - uint num_regions() const { return _num_regions; } + uint num_regions() const { return _num_regions.load_relaxed(); } // Iterate over the entire collection set (all increments calculated so far), applying // the given G1HeapRegionClosure on all of the regions.