# HG changeset patch # User iveresov # Date 1215707394 25200 # Node ID 9bb2c10ac07b0ed478417fbb52d294e8ba3cf1ef # Parent e0c09f7ec5c46897341f4e7ef01b6ab987330b70 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!) Summary: Fixed the incorrect assigment to G1OffsetTableContigSpace::_gc_time_stamp. Also added a little more paranoia to operations on a global timestamp. Reviewed-by: tonyp diff -r e0c09f7ec5c4 -r 9bb2c10ac07b src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jul 03 03:17:29 2008 -0700 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jul 10 09:29:54 2008 -0700 @@ -2279,7 +2279,8 @@ assert(Thread::current() == VMThread::vm_thread(), "should be in vm thread"); guarantee(!is_gc_active(), "collection is not reentrant"); assert(regions_accounted_for(), "Region leakage!"); - ++_gc_time_stamp; + + increment_gc_time_stamp(); if (g1_policy()->in_young_gc_mode()) { assert(check_young_list_well_formed(), diff -r e0c09f7ec5c4 -r 9bb2c10ac07b src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Jul 03 03:17:29 2008 -0700 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Jul 10 09:29:54 2008 -0700 @@ -247,7 +247,7 @@ NumberSeq _pop_obj_rc_at_copy; void print_popularity_summary_info() const; - unsigned _gc_time_stamp; + volatile unsigned _gc_time_stamp; size_t* _surviving_young_words; @@ -653,6 +653,12 @@ void reset_gc_time_stamp() { _gc_time_stamp = 0; + OrderAccess::fence(); + } + + void increment_gc_time_stamp() { + ++_gc_time_stamp; + OrderAccess::fence(); } void iterate_dirty_card_closure(bool concurrent, int worker_i); diff -r e0c09f7ec5c4 -r 9bb2c10ac07b src/share/vm/gc_implementation/g1/heapRegion.cpp --- a/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Jul 03 03:17:29 2008 -0700 +++ b/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Jul 10 09:29:54 2008 -0700 @@ -793,8 +793,8 @@ // will pick up the right saved_mark_word() as the high water mark // of the region. Either way, the behaviour will be correct. ContiguousSpace::set_saved_mark(); - OrderAccess::release_store_ptr((volatile intptr_t*) &_gc_time_stamp, - (intptr_t) curr_gc_time_stamp); + _gc_time_stamp = curr_gc_time_stamp; + OrderAccess::fence(); } }