mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8034079: G1: Refactor the HeapRegionSet hierarchy
Reviewed-by: tschatzl, pliden
This commit is contained in:
parent
1d21f8975b
commit
c88e3def4d
17 changed files with 447 additions and 923 deletions
|
@ -27,87 +27,32 @@
|
|||
|
||||
#include "gc_implementation/g1/heapRegionSet.hpp"
|
||||
|
||||
//////////////////// HeapRegionSetBase ////////////////////
|
||||
|
||||
inline void HeapRegionSetBase::update_for_addition(HeapRegion* hr) {
|
||||
// Assumes the caller has already verified the region.
|
||||
|
||||
_length += 1;
|
||||
_region_num += hr->region_num();
|
||||
_total_used_bytes += hr->used();
|
||||
}
|
||||
|
||||
inline void HeapRegionSetBase::add_internal(HeapRegion* hr) {
|
||||
hrs_assert_region_ok(this, hr, NULL);
|
||||
inline void HeapRegionSetBase::add(HeapRegion* hr) {
|
||||
check_mt_safety();
|
||||
assert(hr->containing_set() == NULL, hrs_ext_msg(this, "should not already have a containing set %u"));
|
||||
assert(hr->next() == NULL, hrs_ext_msg(this, "should not already be linked"));
|
||||
|
||||
update_for_addition(hr);
|
||||
_count.increment(1u, hr->capacity());
|
||||
hr->set_containing_set(this);
|
||||
verify_region(hr);
|
||||
}
|
||||
|
||||
inline void HeapRegionSetBase::update_for_removal(HeapRegion* hr) {
|
||||
// Assumes the caller has already verified the region.
|
||||
assert(_length > 0, hrs_ext_msg(this, "pre-condition"));
|
||||
_length -= 1;
|
||||
|
||||
uint region_num_diff = hr->region_num();
|
||||
assert(region_num_diff <= _region_num,
|
||||
hrs_err_msg("[%s] region's region num: %u "
|
||||
"should be <= region num: %u",
|
||||
name(), region_num_diff, _region_num));
|
||||
_region_num -= region_num_diff;
|
||||
|
||||
size_t used_bytes = hr->used();
|
||||
assert(used_bytes <= _total_used_bytes,
|
||||
hrs_err_msg("[%s] region's used bytes: "SIZE_FORMAT" "
|
||||
"should be <= used bytes: "SIZE_FORMAT,
|
||||
name(), used_bytes, _total_used_bytes));
|
||||
_total_used_bytes -= used_bytes;
|
||||
}
|
||||
|
||||
inline void HeapRegionSetBase::remove_internal(HeapRegion* hr) {
|
||||
hrs_assert_region_ok(this, hr, this);
|
||||
inline void HeapRegionSetBase::remove(HeapRegion* hr) {
|
||||
check_mt_safety();
|
||||
verify_region(hr);
|
||||
assert(hr->next() == NULL, hrs_ext_msg(this, "should already be unlinked"));
|
||||
|
||||
hr->set_containing_set(NULL);
|
||||
update_for_removal(hr);
|
||||
assert(_count.length() > 0, hrs_ext_msg(this, "pre-condition"));
|
||||
_count.decrement(1u, hr->capacity());
|
||||
}
|
||||
|
||||
//////////////////// HeapRegionSet ////////////////////
|
||||
|
||||
inline void HeapRegionSet::add(HeapRegion* hr) {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
// add_internal() will verify the region.
|
||||
add_internal(hr);
|
||||
}
|
||||
|
||||
inline void HeapRegionSet::remove(HeapRegion* hr) {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
// remove_internal() will verify the region.
|
||||
remove_internal(hr);
|
||||
}
|
||||
|
||||
inline void HeapRegionSet::remove_with_proxy(HeapRegion* hr,
|
||||
HeapRegionSet* proxy_set) {
|
||||
// No need to fo the MT safety check here given that this method
|
||||
// does not update the contents of the set but instead accumulates
|
||||
// the changes in proxy_set which is assumed to be thread-local.
|
||||
hrs_assert_sets_match(this, proxy_set);
|
||||
hrs_assert_region_ok(this, hr, this);
|
||||
|
||||
hr->set_containing_set(NULL);
|
||||
proxy_set->update_for_addition(hr);
|
||||
}
|
||||
|
||||
//////////////////// HeapRegionLinkedList ////////////////////
|
||||
|
||||
inline void HeapRegionLinkedList::add_as_head(HeapRegion* hr) {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
inline void FreeRegionList::add_as_head(HeapRegion* hr) {
|
||||
assert((length() == 0 && _head == NULL && _tail == NULL) ||
|
||||
(length() > 0 && _head != NULL && _tail != NULL),
|
||||
hrs_ext_msg(this, "invariant"));
|
||||
// add_internal() will verify the region.
|
||||
add_internal(hr);
|
||||
// add() will verify the region and check mt safety.
|
||||
add(hr);
|
||||
|
||||
// Now link the region.
|
||||
if (_head != NULL) {
|
||||
|
@ -118,13 +63,13 @@ inline void HeapRegionLinkedList::add_as_head(HeapRegion* hr) {
|
|||
_head = hr;
|
||||
}
|
||||
|
||||
inline void HeapRegionLinkedList::add_as_tail(HeapRegion* hr) {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
inline void FreeRegionList::add_as_tail(HeapRegion* hr) {
|
||||
check_mt_safety();
|
||||
assert((length() == 0 && _head == NULL && _tail == NULL) ||
|
||||
(length() > 0 && _head != NULL && _tail != NULL),
|
||||
hrs_ext_msg(this, "invariant"));
|
||||
// add_internal() will verify the region.
|
||||
add_internal(hr);
|
||||
// add() will verify the region and check mt safety
|
||||
add(hr);
|
||||
|
||||
// Now link the region.
|
||||
if (_tail != NULL) {
|
||||
|
@ -135,8 +80,7 @@ inline void HeapRegionLinkedList::add_as_tail(HeapRegion* hr) {
|
|||
_tail = hr;
|
||||
}
|
||||
|
||||
inline HeapRegion* HeapRegionLinkedList::remove_head() {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
inline HeapRegion* FreeRegionList::remove_head() {
|
||||
assert(!is_empty(), hrs_ext_msg(this, "the list should not be empty"));
|
||||
assert(length() > 0 && _head != NULL && _tail != NULL,
|
||||
hrs_ext_msg(this, "invariant"));
|
||||
|
@ -149,14 +93,13 @@ inline HeapRegion* HeapRegionLinkedList::remove_head() {
|
|||
}
|
||||
hr->set_next(NULL);
|
||||
|
||||
// remove_internal() will verify the region.
|
||||
remove_internal(hr);
|
||||
// remove() will verify the region and check mt safety
|
||||
remove(hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
inline HeapRegion* HeapRegionLinkedList::remove_head_or_null() {
|
||||
hrs_assert_mt_safety_ok(this);
|
||||
|
||||
inline HeapRegion* FreeRegionList::remove_head_or_null() {
|
||||
check_mt_safety();
|
||||
if (!is_empty()) {
|
||||
return remove_head();
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue