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

Tue, 26 Aug 2014 09:36:53 +0200

author
tschatzl
date
Tue, 26 Aug 2014 09:36:53 +0200
changeset 7091
a8ea2f110d87
parent 7051
1f1d373cd044
child 7195
c02ec279b062
permissions
-rw-r--r--

8054819: Rename HeapRegionSeq to HeapRegionManager
Reviewed-by: jwilhelm, jmasa

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

mercurial