src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54687 df2b3565f343
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    90   if (! CompressedOops::is_null(o)) {
    90   if (! CompressedOops::is_null(o)) {
    91     oop obj = CompressedOops::decode_not_null(o);
    91     oop obj = CompressedOops::decode_not_null(o);
    92     if (_heap->in_collection_set(obj)) {
    92     if (_heap->in_collection_set(obj)) {
    93       shenandoah_assert_marked(p, obj);
    93       shenandoah_assert_marked(p, obj);
    94       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    94       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    95       if (oopDesc::equals_raw(resolved, obj)) {
    95       if (resolved == obj) {
    96         resolved = _heap->evacuate_object(obj, _thread);
    96         resolved = _heap->evacuate_object(obj, _thread);
    97       }
    97       }
    98       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
    98       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
    99     }
    99     }
   100   }
   100   }
   103   do_oop_work(p);
   103   do_oop_work(p);
   104 }
   104 }
   105 
   105 
   106 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
   106 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
   107   do_oop_work(p);
   107   do_oop_work(p);
       
   108 }
       
   109 
       
   110 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
       
   111   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
       
   112 }
       
   113 
       
   114 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
       
   115   assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
       
   116 
       
   117   oop obj = RawAccess<>::oop_load(p);
       
   118   if (! CompressedOops::is_null(obj)) {
       
   119     if (_heap->in_collection_set(obj)) {
       
   120       shenandoah_assert_marked(p, obj);
       
   121       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
       
   122       if (resolved == obj) {
       
   123         resolved = _heap->evacuate_object(obj, _thread);
       
   124       }
       
   125 
       
   126       Atomic::cmpxchg(resolved, p, obj);
       
   127     }
       
   128   }
       
   129 }
       
   130 
       
   131 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
       
   132   ShouldNotReachHere();
   108 }
   133 }
   109 
   134 
   110 #ifdef ASSERT
   135 #ifdef ASSERT
   111 template <class T>
   136 template <class T>
   112 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
   137 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {