< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp

Print this page

162   SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
163   _satb_mark_queue_set.flush_queue(queue);
164   if (thread->is_Java_thread()) {
165     PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
166     if (gclab != nullptr) {
167       gclab->retire();
168     }
169 
170     ShenandoahPLAB* shenandoah_plab = ShenandoahThreadLocalData::shenandoah_plab(thread);
171     if (shenandoah_plab != nullptr) {
172       shenandoah_plab->retire();
173     }
174 
175     // SATB protocol requires to keep alive reachable oops from roots at the beginning of GC
176     if (_heap->is_concurrent_mark_in_progress()) {
177       ShenandoahKeepAliveClosure oops;
178       StackWatermarkSet::finish_processing(JavaThread::cast(thread), &oops, StackWatermarkKind::gc);
179     } else if (_heap->is_concurrent_weak_root_in_progress() && _heap->is_evacuation_in_progress()) {
180       ShenandoahContextEvacuateUpdateRootsClosure oops;
181       StackWatermarkSet::finish_processing(JavaThread::cast(thread), &oops, StackWatermarkKind::gc);



182     }
183 
184     _heap->flush_region_pin_cache(JavaThread::cast(thread));
185   }
186 }
187 
188 void ShenandoahBarrierSet::keepalive_barrier_slow(oop obj, Filter filter) {
189   if (!ShenandoahSATBBarrier) {
190     return;
191   }
192   assert(obj != nullptr, "Filtered by caller");
193   assert(_heap->is_concurrent_mark_in_progress(), "Filtered by caller");
194 
195   // Filter marked objects before hitting the SATB queues. The same predicate would
196   // be used by SATBMQ::filter to eliminate already marked objects downstream, but
197   // filtering here helps to avoid wasteful SATB queueing work to begin with.
198   if (((filter & FILTER_MARKED) != 0) && !_heap->requires_marking(obj)) {
199     return;
200   }
201 

162   SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
163   _satb_mark_queue_set.flush_queue(queue);
164   if (thread->is_Java_thread()) {
165     PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
166     if (gclab != nullptr) {
167       gclab->retire();
168     }
169 
170     ShenandoahPLAB* shenandoah_plab = ShenandoahThreadLocalData::shenandoah_plab(thread);
171     if (shenandoah_plab != nullptr) {
172       shenandoah_plab->retire();
173     }
174 
175     // SATB protocol requires to keep alive reachable oops from roots at the beginning of GC
176     if (_heap->is_concurrent_mark_in_progress()) {
177       ShenandoahKeepAliveClosure oops;
178       StackWatermarkSet::finish_processing(JavaThread::cast(thread), &oops, StackWatermarkKind::gc);
179     } else if (_heap->is_concurrent_weak_root_in_progress() && _heap->is_evacuation_in_progress()) {
180       ShenandoahContextEvacuateUpdateRootsClosure oops;
181       StackWatermarkSet::finish_processing(JavaThread::cast(thread), &oops, StackWatermarkKind::gc);
182     } else {
183       ShenandoahNoOpClosure oops;
184       StackWatermarkSet::finish_processing(JavaThread::cast(thread), &oops, StackWatermarkKind::gc);
185     }
186 
187     _heap->flush_region_pin_cache(JavaThread::cast(thread));
188   }
189 }
190 
191 void ShenandoahBarrierSet::keepalive_barrier_slow(oop obj, Filter filter) {
192   if (!ShenandoahSATBBarrier) {
193     return;
194   }
195   assert(obj != nullptr, "Filtered by caller");
196   assert(_heap->is_concurrent_mark_in_progress(), "Filtered by caller");
197 
198   // Filter marked objects before hitting the SATB queues. The same predicate would
199   // be used by SATBMQ::filter to eliminate already marked objects downstream, but
200   // filtering here helps to avoid wasteful SATB queueing work to begin with.
201   if (((filter & FILTER_MARKED) != 0) && !_heap->requires_marking(obj)) {
202     return;
203   }
204 
< prev index next >