# HG changeset patch # User tonyp # Date 1319215362 14400 # Node ID 8d161913dfc3a4cbfdeae3a1f9cae2febb934fec # Parent 647872693572462fa14125afe7ab79c654be89a7# Parent 5e5d4821bf07114e4e718584311583ae731cc5a8 Merge diff -r 647872693572 -r 8d161913dfc3 src/share/vm/gc_implementation/g1/heapRegion.hpp --- a/src/share/vm/gc_implementation/g1/heapRegion.hpp Fri Oct 21 07:24:06 2011 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegion.hpp Fri Oct 21 12:42:42 2011 -0400 @@ -431,6 +431,14 @@ return _humongous_start_region; } + // Same as Space::is_in_reserved, but will use the original size of the region. + // The original size is different only for start humongous regions. They get + // their _end set up to be the end of the last continues region of the + // corresponding humongous object. + bool is_in_reserved_raw(const void* p) const { + return _bottom <= p && p < _orig_end; + } + // Makes the current region be a "starts humongous" region, i.e., // the first region in a series of one or more contiguous regions // that will contain a single "humongous" object. The two parameters diff -r 647872693572 -r 8d161913dfc3 src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp --- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Fri Oct 21 07:24:06 2011 -0400 +++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Fri Oct 21 12:42:42 2011 -0400 @@ -143,7 +143,11 @@ // If the test below fails, then this table was reused concurrently // with this operation. This is OK, since the old table was coarsened, // and adding a bit to the new table is never incorrect. - if (loc_hr->is_in_reserved(from)) { + // If the table used to belong to a continues humongous region and is + // now reused for the corresponding start humongous region, we need to + // make sure that we detect this. Thus, we call is_in_reserved_raw() + // instead of just is_in_reserved() here. + if (loc_hr->is_in_reserved_raw(from)) { size_t hw_offset = pointer_delta((HeapWord*)from, loc_hr->bottom()); CardIdx_t from_card = (CardIdx_t) hw_offset >> (CardTableModRefBS::card_shift - LogHeapWordSize);