changeset 9432:ba60b7af3eb4

Update references during mark-compact marking.
author rkennke
date Tue, 28 Jul 2015 16:09:55 +0200
parents d8f95ec43d8a
children 40b528fa3e2a
files src/share/vm/gc/serial/markSweep.inline.hpp src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.hpp
diffstat 2 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc/serial/markSweep.inline.hpp	Mon Jul 27 18:08:56 2015 +0200
+++ b/src/share/vm/gc/serial/markSweep.inline.hpp	Tue Jul 28 16:09:55 2015 +0200
@@ -84,6 +84,9 @@
   T heap_oop = oopDesc::load_heap_oop(p);
   if (!oopDesc::is_null(heap_oop)) {
     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
+    if (UseShenandoahGC) {
+      obj = ShenandoahBarrierSet::resolve_and_update_oop_static(p, obj);
+    }
     if (!obj->mark()->is_marked() &&
         !is_archive_object(obj)) {
       mark_object(obj);
@@ -98,6 +101,9 @@
   T heap_oop = oopDesc::load_heap_oop(p);
   if (!oopDesc::is_null(heap_oop)) {
     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
+    if (UseShenandoahGC) {
+      obj = ShenandoahBarrierSet::resolve_and_update_oop_static(p, obj);
+    }
     if (!obj->mark()->is_marked() &&
         !is_archive_object(obj)) {
       mark_object(obj);
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.hpp	Mon Jul 27 18:08:56 2015 +0200
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSet.hpp	Tue Jul 28 16:09:55 2015 +0200
@@ -91,6 +91,16 @@
 
   virtual oop resolve_oop(oop src);
 
+  template <class T>
+  static inline oop resolve_and_update_oop_static(T p, oop obj) {
+    oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj);
+    if (forw != obj) {
+      obj = forw;
+      oopDesc::encode_store_heap_oop_not_null(p, obj);
+    }
+    return obj;
+  }
+
   static inline oop resolve_oop_static_not_null(oop p) {
     assert(p != NULL, "Must be NULL checked");