# HG changeset patch # User jmasa # Date 1219298704 25200 # Node ID 387a62b4be60275e5b68ad6d58474244c89ac093 # Parent bfcb639d5bca834c3f7b86aac9dd05691a19b863 6728478: Assertion at parallel promotion from young to old generation Summary: The fix avoids a call to address_for_index() in this particular situation where it is not known if the passed index is in bounds. Reviewed-by: tonyp diff -r bfcb639d5bca -r 387a62b4be60 src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp --- a/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp Wed Aug 20 15:41:36 2008 -0700 +++ b/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp Wed Aug 20 23:05:04 2008 -0700 @@ -229,7 +229,7 @@ HeapWord* first_card_start = _bsa->address_for_index(first_card_index); if (first_card_start < pre_top) { HeapWord* second_card_start = - _bsa->address_for_index(first_card_index + 1); + _bsa->inc_by_region_size(first_card_start); // Ensure enough room to fill with the smallest block second_card_start = MAX2(second_card_start, pre_top + AlignmentReserve); diff -r bfcb639d5bca -r 387a62b4be60 src/share/vm/memory/blockOffsetTable.hpp --- a/src/share/vm/memory/blockOffsetTable.hpp Wed Aug 20 15:41:36 2008 -0700 +++ b/src/share/vm/memory/blockOffsetTable.hpp Wed Aug 20 23:05:04 2008 -0700 @@ -199,6 +199,12 @@ // "index" in "_offset_array". HeapWord* address_for_index(size_t index) const; + // Return the address "p" incremented by the size of + // a region. This method does not align the address + // returned to the start of a region. It is a simple + // primitive. + HeapWord* inc_by_region_size(HeapWord* p) const { return p + N_words; } + // Shared space support void serialize(SerializeOopClosure* soc, HeapWord* start, HeapWord* end); };