void FreeRegionList::remove_starting_at(HeapRegion* first, uint num_regions) { check_mt_safety(); assert(num_regions >= 1, hrs_ext_msg(this, "pre-condition")); assert(!is_empty(), hrs_ext_msg(this, "pre-condition")); verify_optional(); DEBUG_ONLY(uint old_length = length();)
void FreeRegionList::remove_all_pending(uint target_count) { check_mt_safety(); assert(target_count > 1, hrs_ext_msg(this, "pre-condition")); assert(!is_empty(), hrs_ext_msg(this, "pre-condition")); verify_optional(); DEBUG_ONLY(uint old_length = length();)
inline void HeapRegionSetBase::remove(HeapRegion* hr) { check_mt_safety(); verify_region(hr); assert(hr->next() == NULL && hr->prev() == NULL, hrs_ext_msg(this, "should already be unlinked")); hr->set_containing_set(NULL); assert(_count.length() > 0, hrs_ext_msg(this, "pre-condition")); _count.decrement(1u, hr->capacity()); }
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 && hr->prev() == NULL, hrs_ext_msg(this, "should not already be linked")); _count.increment(1u, hr->capacity()); hr->set_containing_set(this); verify_region(hr); }
void HeapRegionSetBase::verify_end() { // See comment in verify() about MT safety and verification. check_mt_safety(); assert(_verify_in_progress, hrs_ext_msg(this, "verification should be in progress")); _verify_in_progress = false; }
void FreeRegionList::add_as_head_or_tail(FreeRegionList* from_list, bool as_head) { check_mt_safety(); from_list->check_mt_safety(); verify_optional(); from_list->verify_optional(); if (from_list->is_empty()) { return; } #ifdef ASSERT FreeRegionListIterator iter(from_list); while (iter.more_available()) { HeapRegion* hr = iter.get_next(); // In set_containing_set() we check that we either set the value // from NULL to non-NULL or vice versa to catch bugs. So, we have // to NULL it first before setting it to the value. hr->set_containing_set(NULL); hr->set_containing_set(this); } #endif // ASSERT if (_head == NULL) { assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant")); _head = from_list->_head; _tail = from_list->_tail; } else { assert(length() > 0 && _tail != NULL, hrs_ext_msg(this, "invariant")); if (as_head) { from_list->_tail->set_next(_head); _head->set_prev(from_list->_tail); _head = from_list->_head; } else { _tail->set_next(from_list->_head); from_list->_head->set_prev(_tail); _tail = from_list->_tail; } } _count.increment(from_list->length(), from_list->total_capacity_bytes()); from_list->clear(); verify_optional(); from_list->verify_optional(); }
void HeapRegionSetBase::verify_start() { // See comment in verify() about MT safety and verification. check_mt_safety(); assert(!_verify_in_progress, hrs_ext_msg(this, "verification should not be in progress")); // Do the basic verification first before we do the checks over the regions. HeapRegionSetBase::verify(); _verify_in_progress = true; }
void HeapRegionSetBase::verify() { // It's important that we also observe the MT safety protocol even // for the verification calls. If we do verification without the // appropriate locks and the set changes underneath our feet // verification might fail and send us on a wild goose chase. check_mt_safety(); guarantee(( is_empty() && length() == 0 && total_capacity_bytes() == 0) || (!is_empty() && length() > 0 && total_capacity_bytes() > 0) , hrs_ext_msg(this, "invariant")); }
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")); // We need to unlink it first. HeapRegion* hr = _head; _head = hr->next(); if (_head == NULL) { _tail = NULL; } else { _head->set_prev(NULL); } hr->set_next(NULL); if (_last == hr) { _last = NULL; } // remove() will verify the region and check mt safety. remove(hr); return hr; }
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() will verify the region and check mt safety. add(hr); // Now link the region. if (_head != NULL) { hr->set_next(_head); _head->set_prev(hr); } else { _tail = hr; } _head = hr; }
inline void FreeRegionList::add_ordered(HeapRegion* hr) { check_mt_safety(); assert((length() == 0 && _head == NULL && _tail == NULL) || (length() > 0 && _head != NULL && _tail != NULL), hrs_ext_msg(this, "invariant")); // add() will verify the region and check mt safety. add(hr); // Now link the region if (_head != NULL) { HeapRegion* curr; if (_last != NULL && _last->hrs_index() < hr->hrs_index()) { curr = _last; } else { curr = _head; } // Find first entry with a Region Index larger than entry to insert. while (curr != NULL && curr->hrs_index() < hr->hrs_index()) { curr = curr->next(); } hr->set_next(curr); if (curr == NULL) { // Adding at the end hr->set_prev(_tail); _tail->set_next(hr); _tail = hr; } else if (curr->prev() == NULL) { // Adding at the beginning hr->set_prev(NULL); _head = hr; curr->set_prev(hr); } else { hr->set_prev(curr->prev()); hr->prev()->set_next(hr); curr->set_prev(hr); } } else { // The list was empty _tail = hr; _head = hr; } _last = hr; }
void FreeRegionList::add_ordered(FreeRegionList* from_list) { check_mt_safety(); from_list->check_mt_safety(); verify_optional(); from_list->verify_optional(); if (from_list->is_empty()) { return; } #ifdef ASSERT FreeRegionListIterator iter(from_list); while (iter.more_available()) { HeapRegion* hr = iter.get_next(); // In set_containing_set() we check that we either set the value // from NULL to non-NULL or vice versa to catch bugs. So, we have // to NULL it first before setting it to the value. hr->set_containing_set(NULL); hr->set_containing_set(this); } #endif // ASSERT if (is_empty()) { assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant")); _head = from_list->_head; _tail = from_list->_tail; } else { HeapRegion* curr_to = _head; HeapRegion* curr_from = from_list->_head; while (curr_from != NULL) { while (curr_to != NULL && curr_to->hrm_index() < curr_from->hrm_index()) { curr_to = curr_to->next(); } if (curr_to == NULL) { // The rest of the from list should be added as tail _tail->set_next(curr_from); curr_from->set_prev(_tail); curr_from = NULL; } else { HeapRegion* next_from = curr_from->next(); curr_from->set_next(curr_to); curr_from->set_prev(curr_to->prev()); if (curr_to->prev() == NULL) { _head = curr_from; } else { curr_to->prev()->set_next(curr_from); } curr_to->set_prev(curr_from); curr_from = next_from; } } if (_tail->hrm_index() < from_list->_tail->hrm_index()) { _tail = from_list->_tail; } } _count.increment(from_list->length(), from_list->total_capacity_bytes()); from_list->clear(); verify_optional(); from_list->verify_optional(); }