# HG changeset patch # User Roman Kennke # Date 1418076917 -3600 # Node ID 9e06c024409cb0f33bf8a4143fee9820b8ae17c6 # Parent b0eed0b189c34e74185c207ec6bea5f9944cb147 Make sure that finish marking and prepare evacuation happens in the same pause, even when JNI critical regions are active. diff -r b0eed0b189c3 -r 9e06c024409c src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp Mon Dec 08 17:40:13 2014 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp Mon Dec 08 23:15:17 2014 +0100 @@ -1065,10 +1065,6 @@ void do_oop(narrowOop* p) { Unimplemented(); } - - bool apply_to_weak_ref_discovered_field() { - return true; - } }; void ShenandoahHeap::update_roots() { diff -r b0eed0b189c3 -r 9e06c024409c src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp --- a/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp Mon Dec 08 17:40:13 2014 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp Mon Dec 08 23:15:17 2014 +0100 @@ -73,15 +73,6 @@ } void VM_ShenandoahFinishMark::doit() { - ShenandoahHeap *sh = ShenandoahHeap::heap(); - if (ShenandoahGCVerbose) - tty->print("vm_ShenandoahFinalMark\n"); - - sh->shenandoahPolicy()->record_final_mark_start(); - sh->concurrentMark()->finish_mark_from_roots(); - sh->stop_concurrent_marking(); - sh->shenandoahPolicy()->record_final_mark_end(); - if (! GC_locker::check_active_before_gc()) { VM_ShenandoahStartEvacuation start_evacuation; start_evacuation.doit(); @@ -93,13 +84,27 @@ // This makes the GC background thread wait, and kick off evacuation as // soon as JNI notifies us that critical regions have all been left. + ShenandoahHeap *sh = ShenandoahHeap::heap(); sh->concurrent_thread()->set_waiting_for_jni_before_gc(true); } } void VM_ShenandoahStartEvacuation::doit() { + + // We need to do the finish mark here, so that a JNI critical region + // can't divide it from evacuation start. It is critical that we + // evacuate roots right after finishing marking, so that we don't + // get unmarked objects in the roots. ShenandoahHeap *sh = ShenandoahHeap::heap(); + if (ShenandoahGCVerbose) + tty->print("vm_ShenandoahFinalMark\n"); + + sh->shenandoahPolicy()->record_final_mark_start(); + sh->concurrentMark()->finish_mark_from_roots(); + sh->stop_concurrent_marking(); + sh->shenandoahPolicy()->record_final_mark_end(); + sh->prepare_for_concurrent_evacuation(); sh->set_evacuation_in_progress(true); diff -r b0eed0b189c3 -r 9e06c024409c src/share/vm/oops/oop.cpp --- a/src/share/vm/oops/oop.cpp Mon Dec 08 17:40:13 2014 +0100 +++ b/src/share/vm/oops/oop.cpp Mon Dec 08 23:15:17 2014 +0100 @@ -121,7 +121,7 @@ } } -#ifdef ASSERT +#ifdef ASSERT_DISABLED void oopDesc::shenandoah_check_store_value(oop v) { if (UseShenandoahGC) { ShenandoahHeap* sh = ShenandoahHeap::heap(); diff -r b0eed0b189c3 -r 9e06c024409c src/share/vm/oops/oop.hpp --- a/src/share/vm/oops/oop.hpp Mon Dec 08 17:40:13 2014 +0100 +++ b/src/share/vm/oops/oop.hpp Mon Dec 08 23:15:17 2014 +0100 @@ -166,7 +166,7 @@ static oop load_decode_heap_oop(narrowOop* p); static oop load_decode_heap_oop(oop* p); -#ifdef ASSERT +#ifdef ASSERT_DISABLED static void shenandoah_check_store_value(oop v); #endif diff -r b0eed0b189c3 -r 9e06c024409c src/share/vm/oops/oop.inline.hpp --- a/src/share/vm/oops/oop.inline.hpp Mon Dec 08 17:40:13 2014 +0100 +++ b/src/share/vm/oops/oop.inline.hpp Mon Dec 08 23:15:17 2014 +0100 @@ -241,7 +241,7 @@ // Store already encoded heap oop into the heap. inline void oopDesc::store_heap_oop(oop* p, oop v) { -#ifdef ASSERT +#ifdef ASSERT_DISABLED shenandoah_check_store_value(v); #endif *p = v; @@ -250,14 +250,14 @@ // Encode and store a heap oop. inline void oopDesc::encode_store_heap_oop_not_null(narrowOop* p, oop v) { -#ifdef ASSERT +#ifdef ASSERT_DISABLED shenandoah_check_store_value(v); #endif *p = encode_heap_oop_not_null(v); } inline void oopDesc::encode_store_heap_oop_not_null(oop* p, oop v) { -#ifdef ASSERT +#ifdef ASSERT_DISABLED shenandoah_check_store_value(v); #endif *p = v; @@ -265,13 +265,13 @@ // Encode and store a heap oop allowing for null. inline void oopDesc::encode_store_heap_oop(narrowOop* p, oop v) { -#ifdef ASSERT +#ifdef ASSERT_DISABLED shenandoah_check_store_value(v); #endif *p = encode_heap_oop(v); } inline void oopDesc::encode_store_heap_oop(oop* p, oop v) { -#ifdef ASSERT +#ifdef ASSERT_DISABLED shenandoah_check_store_value(v); #endif *p = v;