< prev index next >
src/hotspot/share/gc/g1/heapRegionSet.cpp
Print this page
@@ -88,10 +88,16 @@
void FreeRegionList::set_unrealistically_long_length(uint len) {
guarantee(_unrealistically_long_length == 0, "should only be set once");
_unrealistically_long_length = len;
}
+void FreeRegionList::abandon() {
+ check_mt_safety();
+ clear();
+ verify_optional();
+}
+
void FreeRegionList::remove_all() {
check_mt_safety();
verify_optional();
HeapRegion* curr = _head;
@@ -110,14 +116,13 @@
clear();
verify_optional();
}
-void FreeRegionList::add_ordered(FreeRegionList* from_list) {
+void FreeRegionList::add_list_common_start(FreeRegionList* from_list) {
check_mt_safety();
from_list->check_mt_safety();
-
verify_optional();
from_list->verify_optional();
if (from_list->is_empty()) {
return;
@@ -136,10 +141,51 @@
// to NULL it first before setting it to the value.
hr->set_containing_set(NULL);
hr->set_containing_set(this);
}
#endif // ASSERT
+}
+
+void FreeRegionList::add_list_common_end(FreeRegionList* from_list) {
+ _length += from_list->length();
+ from_list->clear();
+
+ verify_optional();
+ from_list->verify_optional();
+}
+
+void FreeRegionList::append_ordered(FreeRegionList* from_list) {
+ add_list_common_start(from_list);
+
+ if (from_list->is_empty()) {
+ return;
+ }
+
+ if (is_empty()) {
+ // Make from_list the current list.
+ assert_free_region_list(length() == 0 && _tail == NULL, "invariant");
+ _head = from_list->_head;
+ _tail = from_list->_tail;
+ } else {
+ // Add the from_list to the end of the current list.
+ assert(_tail->hrm_index() < from_list->_head->hrm_index(), "Should be sorted %u < %u",
+ _tail->hrm_index(), from_list->_head->hrm_index());
+
+ _tail->set_next(from_list->_head);
+ from_list->_head->set_prev(_tail);
+ _tail = from_list->_tail;
+ }
+
+ add_list_common_end(from_list);
+}
+
+void FreeRegionList::add_ordered(FreeRegionList* from_list) {
+ add_list_common_start(from_list);
+
+ if (from_list->is_empty()) {
+ return;
+ }
if (is_empty()) {
assert_free_region_list(length() == 0 && _tail == NULL, "invariant");
_head = from_list->_head;
_tail = from_list->_tail;
@@ -176,15 +222,11 @@
if (_tail->hrm_index() < from_list->_tail->hrm_index()) {
_tail = from_list->_tail;
}
}
- _length += from_list->length();
- from_list->clear();
-
- verify_optional();
- from_list->verify_optional();
+ add_list_common_end(from_list);
}
void FreeRegionList::remove_starting_at(HeapRegion* first, uint num_regions) {
check_mt_safety();
assert_free_region_list(num_regions >= 1, "pre-condition");
< prev index next >