hotspot/src/share/vm/gc/g1/heapRegionSet.cpp
changeset 33105 294e48b4f704
parent 31592 43f48e165466
child 33752 0782a966d781
equal deleted inserted replaced
33104:a7c0f60a1294 33105:294e48b4f704
    35   fill_in_ext_msg_extra(msg);
    35   fill_in_ext_msg_extra(msg);
    36 }
    36 }
    37 
    37 
    38 #ifndef PRODUCT
    38 #ifndef PRODUCT
    39 void HeapRegionSetBase::verify_region(HeapRegion* hr) {
    39 void HeapRegionSetBase::verify_region(HeapRegion* hr) {
    40   assert(hr->containing_set() == this, err_msg("Inconsistent containing set for %u", hr->hrm_index()));
    40   assert(hr->containing_set() == this, "Inconsistent containing set for %u", hr->hrm_index());
    41   assert(!hr->is_young(), err_msg("Adding young region %u", hr->hrm_index())); // currently we don't use these sets for young regions
    41   assert(!hr->is_young(), "Adding young region %u", hr->hrm_index()); // currently we don't use these sets for young regions
    42   assert(hr->is_humongous() == regions_humongous(), err_msg("Wrong humongous state for region %u and set %s", hr->hrm_index(), name()));
    42   assert(hr->is_humongous() == regions_humongous(), "Wrong humongous state for region %u and set %s", hr->hrm_index(), name());
    43   assert(hr->is_free() == regions_free(), err_msg("Wrong free state for region %u and set %s", hr->hrm_index(), name()));
    43   assert(hr->is_free() == regions_free(), "Wrong free state for region %u and set %s", hr->hrm_index(), name());
    44   assert(!hr->is_free() || hr->is_empty(), err_msg("Free region %u is not empty for set %s", hr->hrm_index(), name()));
    44   assert(!hr->is_free() || hr->is_empty(), "Free region %u is not empty for set %s", hr->hrm_index(), name());
    45   assert(!hr->is_empty() || hr->is_free() || hr->is_archive(),
    45   assert(!hr->is_empty() || hr->is_free() || hr->is_archive(),
    46          err_msg("Empty region %u is not free or archive for set %s", hr->hrm_index(), name()));
    46          "Empty region %u is not free or archive for set %s", hr->hrm_index(), name());
    47   assert(hr->rem_set()->verify_ready_for_par_iteration(), err_msg("Wrong iteration state %u", hr->hrm_index()));
    47   assert(hr->rem_set()->verify_ready_for_par_iteration(), "Wrong iteration state %u", hr->hrm_index());
    48 }
    48 }
    49 #endif
    49 #endif
    50 
    50 
    51 void HeapRegionSetBase::verify() {
    51 void HeapRegionSetBase::verify() {
    52   // It's important that we also observe the MT safety protocol even
    52   // It's important that we also observe the MT safety protocol even
    55   // verification might fail and send us on a wild goose chase.
    55   // verification might fail and send us on a wild goose chase.
    56   check_mt_safety();
    56   check_mt_safety();
    57 
    57 
    58   guarantee(( is_empty() && length() == 0 && total_capacity_bytes() == 0) ||
    58   guarantee(( is_empty() && length() == 0 && total_capacity_bytes() == 0) ||
    59             (!is_empty() && length() > 0  && total_capacity_bytes() > 0) ,
    59             (!is_empty() && length() > 0  && total_capacity_bytes() > 0) ,
    60             hrs_ext_msg(this, "invariant"));
    60             "%s", hrs_ext_msg(this, "invariant").buffer());
    61 }
    61 }
    62 
    62 
    63 void HeapRegionSetBase::verify_start() {
    63 void HeapRegionSetBase::verify_start() {
    64   // See comment in verify() about MT safety and verification.
    64   // See comment in verify() about MT safety and verification.
    65   check_mt_safety();
    65   check_mt_safety();
    66   assert(!_verify_in_progress,
    66   assert(!_verify_in_progress,
    67          hrs_ext_msg(this, "verification should not be in progress"));
    67          "%s", hrs_ext_msg(this, "verification should not be in progress").buffer());
    68 
    68 
    69   // Do the basic verification first before we do the checks over the regions.
    69   // Do the basic verification first before we do the checks over the regions.
    70   HeapRegionSetBase::verify();
    70   HeapRegionSetBase::verify();
    71 
    71 
    72   _verify_in_progress = true;
    72   _verify_in_progress = true;
    74 
    74 
    75 void HeapRegionSetBase::verify_end() {
    75 void HeapRegionSetBase::verify_end() {
    76   // See comment in verify() about MT safety and verification.
    76   // See comment in verify() about MT safety and verification.
    77   check_mt_safety();
    77   check_mt_safety();
    78   assert(_verify_in_progress,
    78   assert(_verify_in_progress,
    79          hrs_ext_msg(this, "verification should be in progress"));
    79          "%s", hrs_ext_msg(this, "verification should be in progress").buffer());
    80 
    80 
    81   _verify_in_progress = false;
    81   _verify_in_progress = false;
    82 }
    82 }
    83 
    83 
    84 void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
    84 void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
   149     hr->set_containing_set(this);
   149     hr->set_containing_set(this);
   150   }
   150   }
   151   #endif // ASSERT
   151   #endif // ASSERT
   152 
   152 
   153   if (is_empty()) {
   153   if (is_empty()) {
   154     assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant"));
   154     assert(length() == 0 && _tail == NULL, "%s", hrs_ext_msg(this, "invariant").buffer());
   155     _head = from_list->_head;
   155     _head = from_list->_head;
   156     _tail = from_list->_tail;
   156     _tail = from_list->_tail;
   157   } else {
   157   } else {
   158     HeapRegion* curr_to = _head;
   158     HeapRegion* curr_to = _head;
   159     HeapRegion* curr_from = from_list->_head;
   159     HeapRegion* curr_from = from_list->_head;
   196   from_list->verify_optional();
   196   from_list->verify_optional();
   197 }
   197 }
   198 
   198 
   199 void FreeRegionList::remove_starting_at(HeapRegion* first, uint num_regions) {
   199 void FreeRegionList::remove_starting_at(HeapRegion* first, uint num_regions) {
   200   check_mt_safety();
   200   check_mt_safety();
   201   assert(num_regions >= 1, hrs_ext_msg(this, "pre-condition"));
   201   assert(num_regions >= 1, "%s", hrs_ext_msg(this, "pre-condition").buffer());
   202   assert(!is_empty(), hrs_ext_msg(this, "pre-condition"));
   202   assert(!is_empty(), "%s", hrs_ext_msg(this, "pre-condition").buffer());
   203 
   203 
   204   verify_optional();
   204   verify_optional();
   205   DEBUG_ONLY(uint old_length = length();)
   205   DEBUG_ONLY(uint old_length = length();)
   206 
   206 
   207   HeapRegion* curr = first;
   207   HeapRegion* curr = first;
   210     verify_region(curr);
   210     verify_region(curr);
   211     HeapRegion* next = curr->next();
   211     HeapRegion* next = curr->next();
   212     HeapRegion* prev = curr->prev();
   212     HeapRegion* prev = curr->prev();
   213 
   213 
   214     assert(count < num_regions,
   214     assert(count < num_regions,
   215            hrs_err_msg("[%s] should not come across more regions "
   215            "%s", hrs_err_msg("[%s] should not come across more regions "
   216                        "pending for removal than num_regions: %u",
   216                              "pending for removal than num_regions: %u",
   217                        name(), num_regions));
   217                              name(), num_regions).buffer());
   218 
   218 
   219     if (prev == NULL) {
   219     if (prev == NULL) {
   220       assert(_head == curr, hrs_ext_msg(this, "invariant"));
   220       assert(_head == curr, "%s", hrs_ext_msg(this, "invariant").buffer());
   221       _head = next;
   221       _head = next;
   222     } else {
   222     } else {
   223       assert(_head != curr, hrs_ext_msg(this, "invariant"));
   223       assert(_head != curr, "%s", hrs_ext_msg(this, "invariant").buffer());
   224       prev->set_next(next);
   224       prev->set_next(next);
   225     }
   225     }
   226     if (next == NULL) {
   226     if (next == NULL) {
   227       assert(_tail == curr, hrs_ext_msg(this, "invariant"));
   227       assert(_tail == curr, "%s", hrs_ext_msg(this, "invariant").buffer());
   228       _tail = prev;
   228       _tail = prev;
   229     } else {
   229     } else {
   230       assert(_tail != curr, hrs_ext_msg(this, "invariant"));
   230       assert(_tail != curr, "%s", hrs_ext_msg(this, "invariant").buffer());
   231       next->set_prev(prev);
   231       next->set_prev(prev);
   232     }
   232     }
   233     if (_last = curr) {
   233     if (_last = curr) {
   234       _last = NULL;
   234       _last = NULL;
   235     }
   235     }
   241     count++;
   241     count++;
   242     curr = next;
   242     curr = next;
   243   }
   243   }
   244 
   244 
   245   assert(count == num_regions,
   245   assert(count == num_regions,
   246          hrs_err_msg("[%s] count: %u should be == num_regions: %u",
   246          "%s", hrs_err_msg("[%s] count: %u should be == num_regions: %u",
   247                      name(), count, num_regions));
   247                            name(), count, num_regions).buffer());
   248   assert(length() + num_regions == old_length,
   248   assert(length() + num_regions == old_length,
   249          hrs_err_msg("[%s] new length should be consistent "
   249          "%s", hrs_err_msg("[%s] new length should be consistent "
   250                      "new length: %u old length: %u num_regions: %u",
   250                            "new length: %u old length: %u num_regions: %u",
   251                      name(), length(), old_length, num_regions));
   251                            name(), length(), old_length, num_regions).buffer());
   252 
   252 
   253   verify_optional();
   253   verify_optional();
   254 }
   254 }
   255 
   255 
   256 void FreeRegionList::verify() {
   256 void FreeRegionList::verify() {
   303   while (curr != NULL) {
   303   while (curr != NULL) {
   304     verify_region(curr);
   304     verify_region(curr);
   305 
   305 
   306     count++;
   306     count++;
   307     guarantee(count < _unrealistically_long_length,
   307     guarantee(count < _unrealistically_long_length,
   308         hrs_err_msg("[%s] the calculated length: %u seems very long, is there maybe a cycle? curr: " PTR_FORMAT " prev0: " PTR_FORMAT " " "prev1: " PTR_FORMAT " length: %u",
   308         "%s", hrs_err_msg("[%s] the calculated length: %u seems very long, is there maybe a cycle? curr: " PTR_FORMAT " prev0: " PTR_FORMAT " " "prev1: " PTR_FORMAT " length: %u",
   309             name(), count, p2i(curr), p2i(prev0), p2i(prev1), length()));
   309               name(), count, p2i(curr), p2i(prev0), p2i(prev1), length()).buffer());
   310 
   310 
   311     if (curr->next() != NULL) {
   311     if (curr->next() != NULL) {
   312       guarantee(curr->next()->prev() == curr, "Next or prev pointers messed up");
   312       guarantee(curr->next()->prev() == curr, "Next or prev pointers messed up");
   313     }
   313     }
   314     guarantee(curr->hrm_index() == 0 || curr->hrm_index() > last_index, "List should be sorted");
   314     guarantee(curr->hrm_index() == 0 || curr->hrm_index() > last_index, "List should be sorted");
   319     prev1 = prev0;
   319     prev1 = prev0;
   320     prev0 = curr;
   320     prev0 = curr;
   321     curr = curr->next();
   321     curr = curr->next();
   322   }
   322   }
   323 
   323 
   324   guarantee(_tail == prev0, err_msg("Expected %s to end with %u but it ended with %u.", name(), _tail->hrm_index(), prev0->hrm_index()));
   324   guarantee(_tail == prev0, "Expected %s to end with %u but it ended with %u.", name(), _tail->hrm_index(), prev0->hrm_index());
   325   guarantee(_tail == NULL || _tail->next() == NULL, "_tail should not have a next");
   325   guarantee(_tail == NULL || _tail->next() == NULL, "_tail should not have a next");
   326   guarantee(length() == count, err_msg("%s count mismatch. Expected %u, actual %u.", name(), length(), count));
   326   guarantee(length() == count, "%s count mismatch. Expected %u, actual %u.", name(), length(), count);
   327   guarantee(total_capacity_bytes() == capacity, err_msg("%s capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
   327   guarantee(total_capacity_bytes() == capacity, "%s capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
   328       name(), total_capacity_bytes(), capacity));
   328             name(), total_capacity_bytes(), capacity);
   329 }
   329 }
   330 
   330 
   331 // Note on the check_mt_safety() methods below:
   331 // Note on the check_mt_safety() methods below:
   332 //
   332 //
   333 // Verification of the "master" heap region sets / lists that are
   333 // Verification of the "master" heap region sets / lists that are