Mercurial > hg > truffle
comparison src/share/vm/runtime/thread.cpp @ 1842:6e0aac35bfa9
6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
Summary: 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
author | tonyp |
---|---|
date | Fri, 01 Oct 2010 16:43:05 -0400 |
parents | 8f6f7587d292 |
children | 0715f0cf171d |
comparison
equal
deleted
inserted
replaced
1841:32a1f7bf0c21 | 1842:6e0aac35bfa9 |
---|---|
1642 // Flush G1-related queues. | 1642 // Flush G1-related queues. |
1643 void JavaThread::flush_barrier_queues() { | 1643 void JavaThread::flush_barrier_queues() { |
1644 satb_mark_queue().flush(); | 1644 satb_mark_queue().flush(); |
1645 dirty_card_queue().flush(); | 1645 dirty_card_queue().flush(); |
1646 } | 1646 } |
1647 #endif | 1647 |
1648 void JavaThread::initialize_queues() { | |
1649 assert(!SafepointSynchronize::is_at_safepoint(), | |
1650 "we should not be at a safepoint"); | |
1651 | |
1652 ObjPtrQueue& satb_queue = satb_mark_queue(); | |
1653 SATBMarkQueueSet& satb_queue_set = satb_mark_queue_set(); | |
1654 // The SATB queue should have been constructed with its active | |
1655 // field set to false. | |
1656 assert(!satb_queue.is_active(), "SATB queue should not be active"); | |
1657 assert(satb_queue.is_empty(), "SATB queue should be empty"); | |
1658 // If we are creating the thread during a marking cycle, we should | |
1659 // set the active field of the SATB queue to true. | |
1660 if (satb_queue_set.is_active()) { | |
1661 satb_queue.set_active(true); | |
1662 } | |
1663 | |
1664 DirtyCardQueue& dirty_queue = dirty_card_queue(); | |
1665 // The dirty card queue should have been constructed with its | |
1666 // active field set to true. | |
1667 assert(dirty_queue.is_active(), "dirty card queue should be active"); | |
1668 } | |
1669 #endif // !SERIALGC | |
1648 | 1670 |
1649 void JavaThread::cleanup_failed_attach_current_thread() { | 1671 void JavaThread::cleanup_failed_attach_current_thread() { |
1650 if (get_thread_profiler() != NULL) { | 1672 if (get_thread_profiler() != NULL) { |
1651 get_thread_profiler()->disengage(); | 1673 get_thread_profiler()->disengage(); |
1652 ResourceMark rm; | 1674 ResourceMark rm; |
3624 | 3646 |
3625 | 3647 |
3626 void Threads::add(JavaThread* p, bool force_daemon) { | 3648 void Threads::add(JavaThread* p, bool force_daemon) { |
3627 // The threads lock must be owned at this point | 3649 // The threads lock must be owned at this point |
3628 assert_locked_or_safepoint(Threads_lock); | 3650 assert_locked_or_safepoint(Threads_lock); |
3651 | |
3652 // See the comment for this method in thread.hpp for its purpose and | |
3653 // why it is called here. | |
3654 p->initialize_queues(); | |
3629 p->set_next(_thread_list); | 3655 p->set_next(_thread_list); |
3630 _thread_list = p; | 3656 _thread_list = p; |
3631 _number_of_threads++; | 3657 _number_of_threads++; |
3632 oop threadObj = p->threadObj(); | 3658 oop threadObj = p->threadObj(); |
3633 bool daemon = true; | 3659 bool daemon = true; |