--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Mon Oct 18 15:01:41 2010 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Sat Oct 16 17:12:19 2010 -0400
@@ -175,7 +175,7 @@
}
assert(start_card > _array->index_for(_bottom), "Cannot be first card");
assert(_array->offset_array(start_card-1) <= N_words,
- "Offset card has an unexpected value");
+ "Offset card has an unexpected value");
size_t start_card_for_region = start_card;
u_char offset = max_jubyte;
for (int i = 0; i < BlockOffsetArray::N_powers; i++) {
@@ -577,6 +577,16 @@
#endif
}
+void
+G1BlockOffsetArray::set_for_starts_humongous(HeapWord* new_end) {
+ assert(_end == new_end, "_end should have already been updated");
+
+ // The first BOT entry should have offset 0.
+ _array->set_offset_array(_array->index_for(_bottom), 0);
+ // The rest should point to the first one.
+ set_remainder_to_point_to_start(_bottom + N_words, new_end);
+}
+
//////////////////////////////////////////////////////////////////////
// G1BlockOffsetArrayContigSpace
//////////////////////////////////////////////////////////////////////
@@ -626,3 +636,12 @@
"Precondition of call");
_array->set_offset_array(bottom_index, 0);
}
+
+void
+G1BlockOffsetArrayContigSpace::set_for_starts_humongous(HeapWord* new_end) {
+ G1BlockOffsetArray::set_for_starts_humongous(new_end);
+
+ // Make sure _next_offset_threshold and _next_offset_index point to new_end.
+ _next_offset_threshold = new_end;
+ _next_offset_index = _array->index_for(new_end);
+}