< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp
Print this page
rev 59271 : 8240870: Shenandoah: merge evac and update phases
Reviewed-by: XXX
@@ -113,27 +113,25 @@
template <class T>
inline oop ShenandoahHeap::evac_update_with_forwarded(T* p) {
T o = RawAccess<>::oop_load(p);
if (!CompressedOops::is_null(o)) {
- oop heap_oop = CompressedOops::decode_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 obj = CompressedOops::decode_not_null(o);
+ if (in_collection_set(obj)) {
+ oop fwd = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
+ if (fwd == obj) {
+ fwd = evacuate_object(obj, Thread::current());
}
- oop prev = cas_oop(forwarded_oop, p, heap_oop);
- if (prev == heap_oop) {
- return forwarded_oop;
- } else {
- return NULL;
+ if (fwd != obj) { // evac failure otherwise
+ oop prev = cas_oop(fwd, p, obj);
+ if (prev == obj) {
+ return fwd;
+ }
}
}
- return heap_oop;
- } else {
- return NULL;
}
+ return NULL;
}
inline oop ShenandoahHeap::cas_oop(oop n, oop* addr, oop c) {
assert(is_aligned(addr, HeapWordSize), "Address should be aligned: " PTR_FORMAT, p2i(addr));
return (oop) Atomic::cmpxchg(addr, c, n);
@@ -479,49 +477,10 @@
cl->do_object(obj);
cs += size;
}
}
-template <class T>
-class ShenandoahObjectToOopClosure : public ObjectClosure {
- T* _cl;
-public:
- ShenandoahObjectToOopClosure(T* cl) : _cl(cl) {}
-
- void do_object(oop obj) {
- obj->oop_iterate(_cl);
- }
-};
-
-template <class T>
-class ShenandoahObjectToOopBoundedClosure : public ObjectClosure {
- T* _cl;
- MemRegion _bounds;
-public:
- ShenandoahObjectToOopBoundedClosure(T* cl, HeapWord* bottom, HeapWord* top) :
- _cl(cl), _bounds(bottom, top) {}
-
- void do_object(oop obj) {
- obj->oop_iterate(_cl, _bounds);
- }
-};
-
-template<class T>
-inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* top) {
- if (region->is_humongous()) {
- HeapWord* bottom = region->bottom();
- if (top > bottom) {
- region = region->humongous_start_region();
- ShenandoahObjectToOopBoundedClosure<T> objs(cl, bottom, top);
- marked_object_iterate(region, &objs);
- }
- } else {
- ShenandoahObjectToOopClosure<T> objs(cl);
- marked_object_iterate(region, &objs, top);
- }
-}
-
inline ShenandoahHeapRegion* const ShenandoahHeap::get_region(size_t region_idx) const {
if (region_idx < _num_regions) {
return _regions[region_idx];
} else {
return NULL;
< prev index next >