< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp

Print this page
rev 57380 : 8234974: Shenandoah: Do concurrent roots even when no evacuation is necessary


  94   if (!CompressedOops::is_null(o)) {
  95     oop obj = CompressedOops::decode_not_null(o);
  96     if (_heap->in_collection_set(obj) || _traversal_set->is_in((HeapWord*)obj)) {
  97       obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
  98       RawAccess<IS_NOT_NULL>::oop_store(p, obj);
  99     } else {
 100       shenandoah_assert_not_forwarded(p, obj);
 101     }
 102   }
 103 }
 104 
 105 void ShenandoahTraversalUpdateRefsClosure::do_oop(oop* p)       { do_oop_work(p); }
 106 void ShenandoahTraversalUpdateRefsClosure::do_oop(narrowOop* p) { do_oop_work(p); }
 107 
 108 ShenandoahEvacuateUpdateRootsClosure::ShenandoahEvacuateUpdateRootsClosure() :
 109   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
 110 }
 111 
 112 template <class T>
 113 void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p) {
 114   assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 115 
 116   T o = RawAccess<>::oop_load(p);
 117   if (! CompressedOops::is_null(o)) {
 118     oop obj = CompressedOops::decode_not_null(o);
 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       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
 126     }
 127   }
 128 }
 129 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
 130   do_oop_work(p);
 131 }
 132 
 133 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
 134   do_oop_work(p);
 135 }
 136 
 137 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
 138   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
 139 }
 140 
 141 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
 142   assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 143 
 144   oop obj = RawAccess<>::oop_load(p);
 145   if (! CompressedOops::is_null(obj)) {
 146     if (_heap->in_collection_set(obj)) {

 147       shenandoah_assert_marked(p, obj);
 148       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 149       if (resolved == obj) {
 150         resolved = _heap->evacuate_object(obj, _thread);
 151       }
 152 
 153       Atomic::cmpxchg(p, obj, resolved);
 154     }
 155   }
 156 }
 157 
 158 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
 159   ShouldNotReachHere();
 160 }
 161 
 162 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
 163   CodeBlobToOopClosure(cl, true /* fix_relocations */),
 164    _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
 165 }
 166 




  94   if (!CompressedOops::is_null(o)) {
  95     oop obj = CompressedOops::decode_not_null(o);
  96     if (_heap->in_collection_set(obj) || _traversal_set->is_in((HeapWord*)obj)) {
  97       obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
  98       RawAccess<IS_NOT_NULL>::oop_store(p, obj);
  99     } else {
 100       shenandoah_assert_not_forwarded(p, obj);
 101     }
 102   }
 103 }
 104 
 105 void ShenandoahTraversalUpdateRefsClosure::do_oop(oop* p)       { do_oop_work(p); }
 106 void ShenandoahTraversalUpdateRefsClosure::do_oop(narrowOop* p) { do_oop_work(p); }
 107 
 108 ShenandoahEvacuateUpdateRootsClosure::ShenandoahEvacuateUpdateRootsClosure() :
 109   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
 110 }
 111 
 112 template <class T>
 113 void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p) {
 114   assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
 115 
 116   T o = RawAccess<>::oop_load(p);
 117   if (! CompressedOops::is_null(o)) {
 118     oop obj = CompressedOops::decode_not_null(o);
 119     if (_heap->in_collection_set(obj)) {
 120       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 121       shenandoah_assert_marked(p, obj);
 122       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 123       if (resolved == obj) {
 124         resolved = _heap->evacuate_object(obj, _thread);
 125       }
 126       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
 127     }
 128   }
 129 }
 130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
 131   do_oop_work(p);
 132 }
 133 
 134 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
 135   do_oop_work(p);
 136 }
 137 
 138 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
 139   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
 140 }
 141 
 142 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
 143   assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
 144 
 145   oop obj = RawAccess<>::oop_load(p);
 146   if (! CompressedOops::is_null(obj)) {
 147     if (_heap->in_collection_set(obj)) {
 148       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 149       shenandoah_assert_marked(p, obj);
 150       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 151       if (resolved == obj) {
 152         resolved = _heap->evacuate_object(obj, _thread);
 153       }
 154 
 155       Atomic::cmpxchg(p, obj, resolved);
 156     }
 157   }
 158 }
 159 
 160 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
 161   ShouldNotReachHere();
 162 }
 163 
 164 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
 165   CodeBlobToOopClosure(cl, true /* fix_relocations */),
 166    _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
 167 }
 168 


< prev index next >