changeset 7436:9e06c024409c

Make sure that finish marking and prepare evacuation happens in the same pause, even when JNI critical regions are active.
author Roman Kennke <rkennke@redhat.com>
date Mon, 08 Dec 2014 23:15:17 +0100
parents b0eed0b189c3
children e9e008ff4e73
files src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp src/share/vm/oops/oop.cpp src/share/vm/oops/oop.hpp src/share/vm/oops/oop.inline.hpp
diffstat 5 files changed, 21 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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() {
--- 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);
 
--- 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();
--- 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
 
--- 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;