< 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 >