mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
Under certain circumstances a safepoint could happen between a JavaThread object being created and that object being added to the Java threads list. This could cause the active field of that thread's SATB queue to get out-of-sync with respect to the other Java threads. The solution is to activate the SATB queue, when necessary, before adding the thread to the Java threads list, not when the JavaThread object is created. The changeset also includes a small fix to rename the surrogate locker thread from "Surrogate Locker Thread (CMS)" to "Surrogate Locker Thread (Concurrent GC)" since it's also used in G1. Reviewed-by: iveresov, ysr, johnc, jcoomes
This commit is contained in:
parent
8980543dc1
commit
189be5a71f
6 changed files with 65 additions and 8 deletions
|
@ -37,11 +37,10 @@ public:
|
|||
class DirtyCardQueue: public PtrQueue {
|
||||
public:
|
||||
DirtyCardQueue(PtrQueueSet* qset_, bool perm = false) :
|
||||
PtrQueue(qset_, perm)
|
||||
{
|
||||
// Dirty card queues are always active.
|
||||
_active = true;
|
||||
}
|
||||
// Dirty card queues are always active, so we create them with their
|
||||
// active field set to true.
|
||||
PtrQueue(qset_, perm, true /* active */) { }
|
||||
|
||||
// Apply the closure to all elements, and reset the index to make the
|
||||
// buffer empty. If a closure application returns "false", return
|
||||
// "false" immediately, halting the iteration. If "consume" is true,
|
||||
|
|
|
@ -89,6 +89,10 @@ public:
|
|||
return _buf == NULL ? 0 : _sz - _index;
|
||||
}
|
||||
|
||||
bool is_empty() {
|
||||
return _buf == NULL || _sz == _index;
|
||||
}
|
||||
|
||||
// Set the "active" property of the queue to "b". An enqueue to an
|
||||
// inactive thread is a no-op. Setting a queue to inactive resets its
|
||||
// log to the empty state.
|
||||
|
|
|
@ -29,7 +29,12 @@ class JavaThread;
|
|||
class ObjPtrQueue: public PtrQueue {
|
||||
public:
|
||||
ObjPtrQueue(PtrQueueSet* qset_, bool perm = false) :
|
||||
PtrQueue(qset_, perm, qset_->is_active()) { }
|
||||
// SATB queues are only active during marking cycles. We create
|
||||
// them with their active field set to false. If a thread is
|
||||
// created during a cycle and its SATB queue needs to be activated
|
||||
// before the thread starts running, we'll need to set its active
|
||||
// field to true. This is done in JavaThread::initialize_queues().
|
||||
PtrQueue(qset_, perm, false /* active */) { }
|
||||
// Apply the closure to all elements, and reset the index to make the
|
||||
// buffer empty.
|
||||
void apply_closure(ObjectClosure* cl);
|
||||
|
|
|
@ -185,7 +185,7 @@ SurrogateLockerThread* SurrogateLockerThread::make(TRAPS) {
|
|||
instanceKlassHandle klass (THREAD, k);
|
||||
instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
|
||||
|
||||
const char thread_name[] = "Surrogate Locker Thread (CMS)";
|
||||
const char thread_name[] = "Surrogate Locker Thread (Concurrent GC)";
|
||||
Handle string = java_lang_String::create_from_str(thread_name, CHECK_NULL);
|
||||
|
||||
// Initialize thread_oop to put it into the system threadGroup
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue