Mercurial > hg > jdk9-shenandoah > hotspot
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");