src/share/vm/gc_implementation/g1/heapRegionSet.cpp

Thu, 27 Dec 2018 11:43:33 +0800

author
aoqi
date
Thu, 27 Dec 2018 11:43:33 +0800
changeset 9448
73d689add964
parent 9327
f96fcd9e1e1b
parent 7994
04ff2f6cd0eb
child 9931
fd44df5e3bc3
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #include "precompiled.hpp"
tschatzl@7050 26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
aoqi@0 27 #include "gc_implementation/g1/heapRegionRemSet.hpp"
aoqi@0 28 #include "gc_implementation/g1/heapRegionSet.inline.hpp"
aoqi@0 29
aoqi@0 30 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
aoqi@0 31
aoqi@0 32 uint FreeRegionList::_unrealistically_long_length = 0;
aoqi@0 33
aoqi@0 34 void HeapRegionSetBase::fill_in_ext_msg(hrs_ext_msg* msg, const char* message) {
kevinw@9327 35 msg->append("[%s] %s ln: %u cy: " SIZE_FORMAT,
aoqi@0 36 name(), message, length(), total_capacity_bytes());
aoqi@0 37 fill_in_ext_msg_extra(msg);
aoqi@0 38 }
aoqi@0 39
aoqi@0 40 #ifndef PRODUCT
aoqi@0 41 void HeapRegionSetBase::verify_region(HeapRegion* hr) {
tschatzl@7091 42 assert(hr->containing_set() == this, err_msg("Inconsistent containing set for %u", hr->hrm_index()));
tschatzl@7091 43 assert(!hr->is_young(), err_msg("Adding young region %u", hr->hrm_index())); // currently we don't use these sets for young regions
tschatzl@7091 44 assert(hr->isHumongous() == regions_humongous(), err_msg("Wrong humongous state for region %u and set %s", hr->hrm_index(), name()));
brutisso@7195 45 assert(hr->is_free() == regions_free(), err_msg("Wrong free state for region %u and set %s", hr->hrm_index(), name()));
brutisso@7195 46 assert(!hr->is_free() || hr->is_empty(), err_msg("Free region %u is not empty for set %s", hr->hrm_index(), name()));
brutisso@7195 47 assert(!hr->is_empty() || hr->is_free(), err_msg("Empty region %u is not free for set %s", hr->hrm_index(), name()));
tschatzl@7091 48 assert(hr->rem_set()->verify_ready_for_par_iteration(), err_msg("Wrong iteration state %u", hr->hrm_index()));
aoqi@0 49 }
aoqi@0 50 #endif
aoqi@0 51
aoqi@0 52 void HeapRegionSetBase::verify() {
aoqi@0 53 // It's important that we also observe the MT safety protocol even
aoqi@0 54 // for the verification calls. If we do verification without the
aoqi@0 55 // appropriate locks and the set changes underneath our feet
aoqi@0 56 // verification might fail and send us on a wild goose chase.
aoqi@0 57 check_mt_safety();
aoqi@0 58
aoqi@0 59 guarantee(( is_empty() && length() == 0 && total_capacity_bytes() == 0) ||
aoqi@0 60 (!is_empty() && length() >= 0 && total_capacity_bytes() >= 0),
aoqi@0 61 hrs_ext_msg(this, "invariant"));
aoqi@0 62 }
aoqi@0 63
aoqi@0 64 void HeapRegionSetBase::verify_start() {
aoqi@0 65 // See comment in verify() about MT safety and verification.
aoqi@0 66 check_mt_safety();
aoqi@0 67 assert(!_verify_in_progress,
aoqi@0 68 hrs_ext_msg(this, "verification should not be in progress"));
aoqi@0 69
aoqi@0 70 // Do the basic verification first before we do the checks over the regions.
aoqi@0 71 HeapRegionSetBase::verify();
aoqi@0 72
tschatzl@7050 73 _verify_in_progress = true;
aoqi@0 74 }
aoqi@0 75
aoqi@0 76 void HeapRegionSetBase::verify_end() {
aoqi@0 77 // See comment in verify() about MT safety and verification.
aoqi@0 78 check_mt_safety();
aoqi@0 79 assert(_verify_in_progress,
aoqi@0 80 hrs_ext_msg(this, "verification should be in progress"));
aoqi@0 81
aoqi@0 82 _verify_in_progress = false;
aoqi@0 83 }
aoqi@0 84
aoqi@0 85 void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
aoqi@0 86 out->cr();
kevinw@9327 87 out->print_cr("Set: %s (" PTR_FORMAT ")", name(), this);
aoqi@0 88 out->print_cr(" Region Assumptions");
aoqi@0 89 out->print_cr(" humongous : %s", BOOL_TO_STR(regions_humongous()));
brutisso@7195 90 out->print_cr(" free : %s", BOOL_TO_STR(regions_free()));
aoqi@0 91 out->print_cr(" Attributes");
aoqi@0 92 out->print_cr(" length : %14u", length());
kevinw@9327 93 out->print_cr(" total capacity : " SIZE_FORMAT_W(14) " bytes",
aoqi@0 94 total_capacity_bytes());
aoqi@0 95 }
aoqi@0 96
brutisso@7195 97 HeapRegionSetBase::HeapRegionSetBase(const char* name, bool humongous, bool free, HRSMtSafeChecker* mt_safety_checker)
aoqi@0 98 : _name(name), _verify_in_progress(false),
brutisso@7195 99 _is_humongous(humongous), _is_free(free), _mt_safety_checker(mt_safety_checker),
aoqi@0 100 _count()
aoqi@0 101 { }
aoqi@0 102
aoqi@0 103 void FreeRegionList::set_unrealistically_long_length(uint len) {
aoqi@0 104 guarantee(_unrealistically_long_length == 0, "should only be set once");
aoqi@0 105 _unrealistically_long_length = len;
aoqi@0 106 }
aoqi@0 107
aoqi@0 108 void FreeRegionList::fill_in_ext_msg_extra(hrs_ext_msg* msg) {
kevinw@9327 109 msg->append(" hd: " PTR_FORMAT " tl: " PTR_FORMAT, _head, _tail);
aoqi@0 110 }
aoqi@0 111
aoqi@0 112 void FreeRegionList::remove_all() {
aoqi@0 113 check_mt_safety();
aoqi@0 114 verify_optional();
aoqi@0 115
aoqi@0 116 HeapRegion* curr = _head;
aoqi@0 117 while (curr != NULL) {
aoqi@0 118 verify_region(curr);
aoqi@0 119
aoqi@0 120 HeapRegion* next = curr->next();
aoqi@0 121 curr->set_next(NULL);
aoqi@0 122 curr->set_prev(NULL);
aoqi@0 123 curr->set_containing_set(NULL);
aoqi@0 124 curr = next;
aoqi@0 125 }
aoqi@0 126 clear();
aoqi@0 127
aoqi@0 128 verify_optional();
aoqi@0 129 }
aoqi@0 130
aoqi@0 131 void FreeRegionList::add_ordered(FreeRegionList* from_list) {
aoqi@0 132 check_mt_safety();
aoqi@0 133 from_list->check_mt_safety();
aoqi@0 134
aoqi@0 135 verify_optional();
aoqi@0 136 from_list->verify_optional();
aoqi@0 137
aoqi@0 138 if (from_list->is_empty()) {
aoqi@0 139 return;
aoqi@0 140 }
aoqi@0 141
aoqi@0 142 #ifdef ASSERT
aoqi@0 143 FreeRegionListIterator iter(from_list);
aoqi@0 144 while (iter.more_available()) {
aoqi@0 145 HeapRegion* hr = iter.get_next();
aoqi@0 146 // In set_containing_set() we check that we either set the value
aoqi@0 147 // from NULL to non-NULL or vice versa to catch bugs. So, we have
aoqi@0 148 // to NULL it first before setting it to the value.
aoqi@0 149 hr->set_containing_set(NULL);
aoqi@0 150 hr->set_containing_set(this);
aoqi@0 151 }
aoqi@0 152 #endif // ASSERT
aoqi@0 153
tschatzl@7050 154 if (is_empty()) {
tschatzl@7050 155 assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant"));
tschatzl@7050 156 _head = from_list->_head;
tschatzl@7050 157 _tail = from_list->_tail;
tschatzl@7050 158 } else {
tschatzl@7050 159 HeapRegion* curr_to = _head;
tschatzl@7050 160 HeapRegion* curr_from = from_list->_head;
aoqi@0 161
tschatzl@7050 162 while (curr_from != NULL) {
tschatzl@7091 163 while (curr_to != NULL && curr_to->hrm_index() < curr_from->hrm_index()) {
tschatzl@7050 164 curr_to = curr_to->next();
tschatzl@7050 165 }
tschatzl@7050 166
tschatzl@7050 167 if (curr_to == NULL) {
tschatzl@7050 168 // The rest of the from list should be added as tail
tschatzl@7050 169 _tail->set_next(curr_from);
tschatzl@7050 170 curr_from->set_prev(_tail);
tschatzl@7050 171 curr_from = NULL;
tschatzl@7050 172 } else {
tschatzl@7050 173 HeapRegion* next_from = curr_from->next();
tschatzl@7050 174
tschatzl@7050 175 curr_from->set_next(curr_to);
tschatzl@7050 176 curr_from->set_prev(curr_to->prev());
tschatzl@7050 177 if (curr_to->prev() == NULL) {
tschatzl@7050 178 _head = curr_from;
tschatzl@7050 179 } else {
tschatzl@7050 180 curr_to->prev()->set_next(curr_from);
tschatzl@7050 181 }
tschatzl@7050 182 curr_to->set_prev(curr_from);
tschatzl@7050 183
tschatzl@7050 184 curr_from = next_from;
tschatzl@7050 185 }
aoqi@0 186 }
aoqi@0 187
tschatzl@7091 188 if (_tail->hrm_index() < from_list->_tail->hrm_index()) {
tschatzl@7050 189 _tail = from_list->_tail;
aoqi@0 190 }
aoqi@0 191 }
aoqi@0 192
aoqi@0 193 _count.increment(from_list->length(), from_list->total_capacity_bytes());
aoqi@0 194 from_list->clear();
aoqi@0 195
aoqi@0 196 verify_optional();
aoqi@0 197 from_list->verify_optional();
aoqi@0 198 }
aoqi@0 199
tschatzl@7050 200 void FreeRegionList::remove_starting_at(HeapRegion* first, uint num_regions) {
aoqi@0 201 check_mt_safety();
tschatzl@7050 202 assert(num_regions >= 1, hrs_ext_msg(this, "pre-condition"));
aoqi@0 203 assert(!is_empty(), hrs_ext_msg(this, "pre-condition"));
aoqi@0 204
aoqi@0 205 verify_optional();
aoqi@0 206 DEBUG_ONLY(uint old_length = length();)
aoqi@0 207
tschatzl@7050 208 HeapRegion* curr = first;
aoqi@0 209 uint count = 0;
tschatzl@7050 210 while (count < num_regions) {
aoqi@0 211 verify_region(curr);
aoqi@0 212 HeapRegion* next = curr->next();
aoqi@0 213 HeapRegion* prev = curr->prev();
aoqi@0 214
tschatzl@7050 215 assert(count < num_regions,
tschatzl@7050 216 hrs_err_msg("[%s] should not come across more regions "
tschatzl@7050 217 "pending for removal than num_regions: %u",
tschatzl@7050 218 name(), num_regions));
aoqi@0 219
tschatzl@7050 220 if (prev == NULL) {
tschatzl@7050 221 assert(_head == curr, hrs_ext_msg(this, "invariant"));
tschatzl@7050 222 _head = next;
tschatzl@7050 223 } else {
tschatzl@7050 224 assert(_head != curr, hrs_ext_msg(this, "invariant"));
tschatzl@7050 225 prev->set_next(next);
tschatzl@7050 226 }
tschatzl@7050 227 if (next == NULL) {
tschatzl@7050 228 assert(_tail == curr, hrs_ext_msg(this, "invariant"));
tschatzl@7050 229 _tail = prev;
tschatzl@7050 230 } else {
tschatzl@7050 231 assert(_tail != curr, hrs_ext_msg(this, "invariant"));
tschatzl@7050 232 next->set_prev(prev);
tschatzl@7050 233 }
tschatzl@7050 234 if (_last = curr) {
tschatzl@7050 235 _last = NULL;
tschatzl@7050 236 }
aoqi@0 237
tschatzl@7050 238 curr->set_next(NULL);
tschatzl@7050 239 curr->set_prev(NULL);
tschatzl@7050 240 remove(curr);
aoqi@0 241
tschatzl@7050 242 count++;
aoqi@0 243 curr = next;
aoqi@0 244 }
aoqi@0 245
tschatzl@7050 246 assert(count == num_regions,
tschatzl@7050 247 hrs_err_msg("[%s] count: %u should be == num_regions: %u",
tschatzl@7050 248 name(), count, num_regions));
tschatzl@7050 249 assert(length() + num_regions == old_length,
aoqi@0 250 hrs_err_msg("[%s] new length should be consistent "
tschatzl@7050 251 "new length: %u old length: %u num_regions: %u",
tschatzl@7050 252 name(), length(), old_length, num_regions));
aoqi@0 253
aoqi@0 254 verify_optional();
aoqi@0 255 }
aoqi@0 256
aoqi@0 257 void FreeRegionList::verify() {
aoqi@0 258 // See comment in HeapRegionSetBase::verify() about MT safety and
aoqi@0 259 // verification.
aoqi@0 260 check_mt_safety();
aoqi@0 261
aoqi@0 262 // This will also do the basic verification too.
aoqi@0 263 verify_start();
aoqi@0 264
aoqi@0 265 verify_list();
aoqi@0 266
aoqi@0 267 verify_end();
aoqi@0 268 }
aoqi@0 269
aoqi@0 270 void FreeRegionList::clear() {
aoqi@0 271 _count = HeapRegionSetCount();
aoqi@0 272 _head = NULL;
aoqi@0 273 _tail = NULL;
aoqi@0 274 _last = NULL;
aoqi@0 275 }
aoqi@0 276
aoqi@0 277 void FreeRegionList::print_on(outputStream* out, bool print_contents) {
aoqi@0 278 HeapRegionSetBase::print_on(out, print_contents);
aoqi@0 279 out->print_cr(" Linking");
kevinw@9327 280 out->print_cr(" head : " PTR_FORMAT, _head);
kevinw@9327 281 out->print_cr(" tail : " PTR_FORMAT, _tail);
aoqi@0 282
aoqi@0 283 if (print_contents) {
aoqi@0 284 out->print_cr(" Contents");
aoqi@0 285 FreeRegionListIterator iter(this);
aoqi@0 286 while (iter.more_available()) {
aoqi@0 287 HeapRegion* hr = iter.get_next();
aoqi@0 288 hr->print_on(out);
aoqi@0 289 }
aoqi@0 290 }
tschatzl@7050 291
tschatzl@7050 292 out->cr();
aoqi@0 293 }
aoqi@0 294
aoqi@0 295 void FreeRegionList::verify_list() {
tschatzl@7050 296 HeapRegion* curr = _head;
aoqi@0 297 HeapRegion* prev1 = NULL;
aoqi@0 298 HeapRegion* prev0 = NULL;
aoqi@0 299 uint count = 0;
aoqi@0 300 size_t capacity = 0;
aoqi@0 301 uint last_index = 0;
aoqi@0 302
aoqi@0 303 guarantee(_head == NULL || _head->prev() == NULL, "_head should not have a prev");
aoqi@0 304 while (curr != NULL) {
aoqi@0 305 verify_region(curr);
aoqi@0 306
aoqi@0 307 count++;
aoqi@0 308 guarantee(count < _unrealistically_long_length,
kevinw@9327 309 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", name(), count, curr, prev0, prev1, length()));
aoqi@0 310
aoqi@0 311 if (curr->next() != NULL) {
aoqi@0 312 guarantee(curr->next()->prev() == curr, "Next or prev pointers messed up");
aoqi@0 313 }
tschatzl@7091 314 guarantee(curr->hrm_index() == 0 || curr->hrm_index() > last_index, "List should be sorted");
tschatzl@7091 315 last_index = curr->hrm_index();
aoqi@0 316
aoqi@0 317 capacity += curr->capacity();
aoqi@0 318
aoqi@0 319 prev1 = prev0;
aoqi@0 320 prev0 = curr;
aoqi@0 321 curr = curr->next();
aoqi@0 322 }
aoqi@0 323
tschatzl@7091 324 guarantee(_tail == prev0, err_msg("Expected %s to end with %u but it ended with %u.", name(), _tail->hrm_index(), prev0->hrm_index()));
aoqi@0 325 guarantee(_tail == NULL || _tail->next() == NULL, "_tail should not have a next");
aoqi@0 326 guarantee(length() == count, err_msg("%s count mismatch. Expected %u, actual %u.", name(), length(), count));
aoqi@0 327 guarantee(total_capacity_bytes() == capacity, err_msg("%s capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
aoqi@0 328 name(), total_capacity_bytes(), capacity));
aoqi@0 329 }
aoqi@0 330
aoqi@0 331 // Note on the check_mt_safety() methods below:
aoqi@0 332 //
aoqi@0 333 // Verification of the "master" heap region sets / lists that are
aoqi@0 334 // maintained by G1CollectedHeap is always done during a STW pause and
aoqi@0 335 // by the VM thread at the start / end of the pause. The standard
aoqi@0 336 // verification methods all assert check_mt_safety(). This is
aoqi@0 337 // important as it ensures that verification is done without
aoqi@0 338 // concurrent updates taking place at the same time. It follows, that,
aoqi@0 339 // for the "master" heap region sets / lists, the check_mt_safety()
aoqi@0 340 // method should include the VM thread / STW case.
aoqi@0 341
aoqi@0 342 void MasterFreeRegionListMtSafeChecker::check() {
aoqi@0 343 // Master Free List MT safety protocol:
aoqi@0 344 // (a) If we're at a safepoint, operations on the master free list
aoqi@0 345 // should be invoked by either the VM thread (which will serialize
aoqi@0 346 // them) or by the GC workers while holding the
aoqi@0 347 // FreeList_lock.
aoqi@0 348 // (b) If we're not at a safepoint, operations on the master free
aoqi@0 349 // list should be invoked while holding the Heap_lock.
aoqi@0 350
aoqi@0 351 if (SafepointSynchronize::is_at_safepoint()) {
aoqi@0 352 guarantee(Thread::current()->is_VM_thread() ||
aoqi@0 353 FreeList_lock->owned_by_self(), "master free list MT safety protocol at a safepoint");
aoqi@0 354 } else {
aoqi@0 355 guarantee(Heap_lock->owned_by_self(), "master free list MT safety protocol outside a safepoint");
aoqi@0 356 }
aoqi@0 357 }
aoqi@0 358
aoqi@0 359 void SecondaryFreeRegionListMtSafeChecker::check() {
aoqi@0 360 // Secondary Free List MT safety protocol:
aoqi@0 361 // Operations on the secondary free list should always be invoked
aoqi@0 362 // while holding the SecondaryFreeList_lock.
aoqi@0 363
aoqi@0 364 guarantee(SecondaryFreeList_lock->owned_by_self(), "secondary free list MT safety protocol");
aoqi@0 365 }
aoqi@0 366
aoqi@0 367 void OldRegionSetMtSafeChecker::check() {
aoqi@0 368 // Master Old Set MT safety protocol:
aoqi@0 369 // (a) If we're at a safepoint, operations on the master old set
aoqi@0 370 // should be invoked:
aoqi@0 371 // - by the VM thread (which will serialize them), or
aoqi@0 372 // - by the GC workers while holding the FreeList_lock, if we're
aoqi@0 373 // at a safepoint for an evacuation pause (this lock is taken
aoqi@0 374 // anyway when an GC alloc region is retired so that a new one
aoqi@0 375 // is allocated from the free list), or
aoqi@0 376 // - by the GC workers while holding the OldSets_lock, if we're at a
aoqi@0 377 // safepoint for a cleanup pause.
aoqi@0 378 // (b) If we're not at a safepoint, operations on the master old set
aoqi@0 379 // should be invoked while holding the Heap_lock.
aoqi@0 380
aoqi@0 381 if (SafepointSynchronize::is_at_safepoint()) {
aoqi@0 382 guarantee(Thread::current()->is_VM_thread()
aoqi@0 383 || FreeList_lock->owned_by_self() || OldSets_lock->owned_by_self(),
aoqi@0 384 "master old set MT safety protocol at a safepoint");
aoqi@0 385 } else {
aoqi@0 386 guarantee(Heap_lock->owned_by_self(), "master old set MT safety protocol outside a safepoint");
aoqi@0 387 }
aoqi@0 388 }
aoqi@0 389
aoqi@0 390 void HumongousRegionSetMtSafeChecker::check() {
aoqi@0 391 // Humongous Set MT safety protocol:
aoqi@0 392 // (a) If we're at a safepoint, operations on the master humongous
aoqi@0 393 // set should be invoked by either the VM thread (which will
aoqi@0 394 // serialize them) or by the GC workers while holding the
aoqi@0 395 // OldSets_lock.
aoqi@0 396 // (b) If we're not at a safepoint, operations on the master
aoqi@0 397 // humongous set should be invoked while holding the Heap_lock.
aoqi@0 398
aoqi@0 399 if (SafepointSynchronize::is_at_safepoint()) {
aoqi@0 400 guarantee(Thread::current()->is_VM_thread() ||
aoqi@0 401 OldSets_lock->owned_by_self(),
aoqi@0 402 "master humongous set MT safety protocol at a safepoint");
aoqi@0 403 } else {
aoqi@0 404 guarantee(Heap_lock->owned_by_self(),
aoqi@0 405 "master humongous set MT safety protocol outside a safepoint");
aoqi@0 406 }
aoqi@0 407 }
tschatzl@7051 408
tschatzl@7051 409 void FreeRegionList_test() {
tschatzl@7051 410 FreeRegionList l("test");
tschatzl@7051 411
tschatzl@7051 412 const uint num_regions_in_test = 5;
tschatzl@7051 413 // Create a fake heap. It does not need to be valid, as the HeapRegion constructor
tschatzl@7051 414 // does not access it.
tschatzl@7051 415 MemRegion heap(NULL, num_regions_in_test * HeapRegion::GrainWords);
tschatzl@7051 416 // Allocate a fake BOT because the HeapRegion constructor initializes
tschatzl@7051 417 // the BOT.
tschatzl@7051 418 size_t bot_size = G1BlockOffsetSharedArray::compute_size(heap.word_size());
tschatzl@7051 419 HeapWord* bot_data = NEW_C_HEAP_ARRAY(HeapWord, bot_size, mtGC);
tschatzl@7051 420 ReservedSpace bot_rs(G1BlockOffsetSharedArray::compute_size(heap.word_size()));
tschatzl@7051 421 G1RegionToSpaceMapper* bot_storage =
tschatzl@7051 422 G1RegionToSpaceMapper::create_mapper(bot_rs,
tschatzl@7781 423 bot_rs.size(),
tschatzl@7051 424 os::vm_page_size(),
tschatzl@7051 425 HeapRegion::GrainBytes,
tschatzl@7051 426 G1BlockOffsetSharedArray::N_bytes,
tschatzl@7051 427 mtGC);
tschatzl@7051 428 G1BlockOffsetSharedArray oa(heap, bot_storage);
tschatzl@7051 429 bot_storage->commit_regions(0, num_regions_in_test);
tschatzl@7051 430 HeapRegion hr0(0, &oa, heap);
tschatzl@7051 431 HeapRegion hr1(1, &oa, heap);
tschatzl@7051 432 HeapRegion hr2(2, &oa, heap);
tschatzl@7051 433 HeapRegion hr3(3, &oa, heap);
tschatzl@7051 434 HeapRegion hr4(4, &oa, heap);
tschatzl@7051 435 l.add_ordered(&hr1);
tschatzl@7051 436 l.add_ordered(&hr0);
tschatzl@7051 437 l.add_ordered(&hr3);
tschatzl@7051 438 l.add_ordered(&hr4);
tschatzl@7051 439 l.add_ordered(&hr2);
tschatzl@7051 440 assert(l.length() == num_regions_in_test, "wrong length");
tschatzl@7051 441 l.verify_list();
tschatzl@7051 442
tschatzl@7051 443 bot_storage->uncommit_regions(0, num_regions_in_test);
tschatzl@7051 444 delete bot_storage;
tschatzl@7051 445 FREE_C_HEAP_ARRAY(HeapWord, bot_data, mtGC);
tschatzl@7051 446 }

mercurial