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
|