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 |