< prev index next >
src/share/vm/gc_implementation/shenandoah/shenandoahHeap.inline.hpp
Print this page
rev 11463 : Backport Traversal GC
@@ -96,10 +96,33 @@
} else {
return NULL;
}
}
+template <class T>
+inline oop ShenandoahHeap::evac_update_with_forwarded(T* p) {
+ T o = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(o)) {
+ oop heap_oop = oopDesc::decode_heap_oop_not_null(o);
+ if (in_collection_set(heap_oop)) {
+ oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop);
+ if (forwarded_oop == heap_oop) {
+ forwarded_oop = evacuate_object(heap_oop, Thread::current());
+ }
+ oop prev = cas_oop(forwarded_oop, p, heap_oop);
+ if (prev == heap_oop) {
+ return forwarded_oop;
+ } else {
+ return NULL;
+ }
+ }
+ return heap_oop;
+ } else {
+ return NULL;
+ }
+}
+
inline oop ShenandoahHeap::cas_oop(oop n, oop* addr, oop c) {
assert(is_ptr_aligned(addr, sizeof(narrowOop)), err_msg("Address should be aligned: " PTR_FORMAT, p2i(addr)));
return (oop) Atomic::cmpxchg_ptr(n, addr, c);
}
@@ -270,17 +293,21 @@
inline bool ShenandoahHeap::is_stable() const {
return _gc_state.is_clear();
}
inline bool ShenandoahHeap::is_idle() const {
- return _gc_state.is_unset(MARKING | EVACUATION | UPDATEREFS);
+ return _gc_state.is_unset(MARKING | EVACUATION | UPDATEREFS | TRAVERSAL);
}
inline bool ShenandoahHeap::is_concurrent_mark_in_progress() const {
return _gc_state.is_set(MARKING);
}
+inline bool ShenandoahHeap::is_concurrent_traversal_in_progress() const {
+ return _gc_state.is_set(TRAVERSAL);
+}
+
inline bool ShenandoahHeap::is_evacuation_in_progress() const {
return _gc_state.is_set(EVACUATION);
}
inline bool ShenandoahHeap::is_gc_in_progress_mask(uint mask) const {
< prev index next >