127
128 oop obj = RawAccess<>::oop_load(p);
129 if (! CompressedOops::is_null(obj)) {
130 if (_heap->in_collection_set(obj)) {
131 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
132 shenandoah_assert_marked(p, obj);
133 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
134 if (resolved == obj) {
135 resolved = _heap->evacuate_object(obj, _thread);
136 }
137
138 Atomic::cmpxchg(p, obj, resolved);
139 }
140 }
141 }
142
143 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
144 ShouldNotReachHere();
145 }
146
147 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
148 CodeBlobToOopClosure(cl, true /* fix_relocations */),
149 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
150 }
151
152 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
153 nmethod* const nm = cb->as_nmethod_or_null();
154 if (nm != NULL && nm->oops_do_try_claim()) {
155 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
156 CodeBlobToOopClosure::do_code_blob(cb);
157 _bs->disarm(nm);
158 }
159 }
160
161 ShenandoahRendezvousClosure::ShenandoahRendezvousClosure() :
162 HandshakeClosure("ShenandoahRendezvous") {
163 }
164
165 void ShenandoahRendezvousClosure::do_thread(Thread* thread) {
166 }
|
127
128 oop obj = RawAccess<>::oop_load(p);
129 if (! CompressedOops::is_null(obj)) {
130 if (_heap->in_collection_set(obj)) {
131 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
132 shenandoah_assert_marked(p, obj);
133 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
134 if (resolved == obj) {
135 resolved = _heap->evacuate_object(obj, _thread);
136 }
137
138 Atomic::cmpxchg(p, obj, resolved);
139 }
140 }
141 }
142
143 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
144 ShouldNotReachHere();
145 }
146
147 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
148 ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive) :
149 _is_alive(is_alive), _keep_alive(keep_alive) {
150 if (!CONCURRENT) {
151 assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
152 }
153 }
154
155 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
156 void ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::do_oop(oop* p) {
157 oop obj = RawAccess<>::oop_load(p);
158 if (!CompressedOops::is_null(obj)) {
159 if (_is_alive->do_object_b(obj)) {
160 _keep_alive->do_oop(p);
161 } else {
162 if (CONCURRENT) {
163 Atomic::cmpxchg(p, obj, oop());
164 } else {
165 RawAccess<IS_NOT_NULL>::oop_store(p, oop());
166 }
167 }
168 }
169 }
170
171 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
172 void ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::do_oop(narrowOop* p) {
173 ShouldNotReachHere();
174 }
175
176 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
177 CodeBlobToOopClosure(cl, true /* fix_relocations */),
178 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
179 }
180
181 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
182 nmethod* const nm = cb->as_nmethod_or_null();
183 if (nm != NULL && nm->oops_do_try_claim()) {
184 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
185 CodeBlobToOopClosure::do_code_blob(cb);
186 _bs->disarm(nm);
187 }
188 }
189
190 ShenandoahRendezvousClosure::ShenandoahRendezvousClosure() :
191 HandshakeClosure("ShenandoahRendezvous") {
192 }
193
194 void ShenandoahRendezvousClosure::do_thread(Thread* thread) {
195 }
|