# HG changeset patch # User rkennke # Date 1553019294 -3600 # Tue Mar 19 19:14:54 2019 +0100 # Node ID d9bb45028b015877d7841858513de0660700e1b8 # Parent 7a9a828195c769181646a6e611eea32d46763fb2 8221086: Shenandoah-specific workaround for JDK-8220671 diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.hpp b/src/hotspot/share/gc/g1/g1BarrierSet.hpp --- a/src/hotspot/share/gc/g1/g1BarrierSet.hpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.hpp @@ -79,6 +79,7 @@ virtual void on_thread_destroy(Thread* thread); virtual void on_thread_attach(Thread* thread); virtual void on_thread_detach(Thread* thread); + virtual bool needs_sts_sync_on_attach_detach() { return true; } BufferNode::Allocator& satb_mark_queue_buffer_allocator(); BufferNode::Allocator& dirty_card_queue_buffer_allocator(); diff --git a/src/hotspot/share/gc/shared/barrierSet.hpp b/src/hotspot/share/gc/shared/barrierSet.hpp --- a/src/hotspot/share/gc/shared/barrierSet.hpp +++ b/src/hotspot/share/gc/shared/barrierSet.hpp @@ -132,6 +132,7 @@ virtual void on_thread_destroy(Thread* thread) {} virtual void on_thread_attach(Thread* thread) {} virtual void on_thread_detach(Thread* thread) {} + virtual bool needs_sts_sync_on_attach_detach() { return false; } virtual void make_parsable(JavaThread* thread) {} #ifdef CHECK_UNHANDLED_OOPS diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp @@ -86,6 +86,7 @@ virtual void on_thread_destroy(Thread* thread); virtual void on_thread_attach(Thread* thread); virtual void on_thread_detach(Thread* thread); + virtual bool needs_sts_sync_on_attach_detach() { return true; } static inline oop resolve_forwarded_not_null(oop p); static inline oop resolve_forwarded(oop p); diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -1311,10 +1311,16 @@ } void NonJavaThread::pre_run() { - // Initialize BarrierSet-related data before adding to list. - assert(BarrierSet::barrier_set() != NULL, "invariant"); - BarrierSet::barrier_set()->on_thread_attach(this); - add_to_the_list(); + { + BarrierSet* bs = BarrierSet::barrier_set(); + assert(BarrierSet::barrier_set() != NULL, "invariant"); + SuspendibleThreadSetJoiner sts(bs->needs_sts_sync_on_attach_detach() && + !is_VM_thread() && !is_Worker_thread()); + add_to_the_list(); + + // Initialize BarrierSet-related data after adding to list. + bs->on_thread_attach(this); + } // This is slightly odd in that NamedThread is a subclass, but // in fact name() is defined in Thread @@ -1324,9 +1330,16 @@ void NonJavaThread::post_run() { JFR_ONLY(Jfr::on_thread_exit(this);) - // Clean up BarrierSet data before removing from list. - BarrierSet::barrier_set()->on_thread_detach(this); - remove_from_the_list(); + { + BarrierSet* bs = BarrierSet::barrier_set(); + SuspendibleThreadSetJoiner sts(bs->needs_sts_sync_on_attach_detach() && + !is_VM_thread() && !is_Worker_thread()); + + // Clean up BarrierSet data before removing from list. + bs->on_thread_detach(this); + + remove_from_the_list(); + } // Ensure thread-local-storage is cleared before termination. Thread::clear_thread_current(); }