8219857: Shenandoah GC may initialize thread's gclab twice
authorzgu
Thu, 28 Feb 2019 08:44:09 -0500
changeset 53953 235b0e817c32
parent 53952 3ccf7e10ba07
child 53954 b5f4a8477a20
8219857: Shenandoah GC may initialize thread's gclab twice Reviewed-by: rkennke
src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp	Thu Feb 28 13:53:38 2019 +0100
+++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp	Thu Feb 28 08:44:09 2019 -0500
@@ -482,7 +482,9 @@
 class ShenandoahInitGCLABClosure : public ThreadClosure {
 public:
   void do_thread(Thread* thread) {
-    if (thread != NULL && (thread->is_Java_thread() || thread->is_Worker_thread())) {
+    assert(thread != NULL, "Sanity");
+    assert(!thread->is_Java_thread(), "Don't expect JavaThread this early");
+    if (thread->is_Worker_thread()) {
       ShenandoahThreadLocalData::initialize_gclab(thread);
     }
   }
@@ -494,8 +496,6 @@
 
   ShenandoahInitGCLABClosure init_gclabs;
   Threads::threads_do(&init_gclabs);
-  _workers->threads_do(&init_gclabs);
-  _safepoint_workers->threads_do(&init_gclabs);
 
   // gclab can not be initialized early during VM startup, as it can not determinate its max_size.
   // Now, we will let WorkGang to initialize gclab when new worker is created.
--- a/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp	Thu Feb 28 13:53:38 2019 +0100
+++ b/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp	Thu Feb 28 08:44:09 2019 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
@@ -122,6 +122,7 @@
 
   static void initialize_gclab(Thread* thread) {
     assert (thread->is_Java_thread() || thread->is_Worker_thread(), "Only Java and GC worker threads are allowed to get GCLABs");
+    assert(data(thread)->_gclab == NULL, "Only initialize once");
     data(thread)->_gclab = new PLAB(PLAB::min_size());
     data(thread)->_gclab_size = 0;
   }