< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
Print this page
rev 54185 : 8220671: Initialization race for non-JavaThread PtrQueues
*** 350,359 ****
--- 350,362 ----
}
void ShenandoahBarrierSet::on_thread_attach(Thread *thread) {
assert(!thread->is_Java_thread() || !SafepointSynchronize::is_at_safepoint(),
"We should not be at a safepoint");
+ SuspendibleThreadSetJoiner sts(!thread->is_Java_thread() && // Already syncs with safepoints
+ !thread->is_VM_thread() && // Drives the safepoint itself
+ !thread->is_Worker_thread());// Might block if used at SP, syncs otherwise
SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
assert(!queue.is_active(), "SATB queue should not be active");
assert( queue.is_empty(), "SATB queue should be empty");
queue.set_active(_satb_mark_queue_set.is_active());
if (thread->is_Java_thread()) {
*** 361,370 ****
--- 364,376 ----
ShenandoahThreadLocalData::initialize_gclab(thread);
}
}
void ShenandoahBarrierSet::on_thread_detach(Thread *thread) {
+ SuspendibleThreadSetJoiner sts(!thread->is_Java_thread() && // Already syncs with safepoints
+ !thread->is_VM_thread() && // Drives the safepoint itself
+ !thread->is_Worker_thread());// Might block if used at SP, syncs otherwise
SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread);
queue.flush();
if (thread->is_Java_thread()) {
PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
if (gclab != NULL) {
< prev index next >