提交 052b811d 编写于 作者: P pliden

8029162: G1: Shared SATB queue never enabled

Reviewed-by: brutisso, mgerdin, tschatzl
上级 dc6f450b
...@@ -219,58 +219,52 @@ void SATBMarkQueueSet::handle_zero_index_for_thread(JavaThread* t) { ...@@ -219,58 +219,52 @@ void SATBMarkQueueSet::handle_zero_index_for_thread(JavaThread* t) {
} }
#ifdef ASSERT #ifdef ASSERT
void SATBMarkQueueSet::dump_active_values(JavaThread* first, void SATBMarkQueueSet::dump_active_states(bool expected_active) {
bool expected_active) { gclog_or_tty->print_cr("Expected SATB active state: %s",
gclog_or_tty->print_cr("SATB queue active values for Java Threads"); expected_active ? "ACTIVE" : "INACTIVE");
gclog_or_tty->print_cr(" SATB queue set: active is %s", gclog_or_tty->print_cr("Actual SATB active states:");
(is_active()) ? "TRUE" : "FALSE"); gclog_or_tty->print_cr(" Queue set: %s", is_active() ? "ACTIVE" : "INACTIVE");
gclog_or_tty->print_cr(" expected_active is %s", for (JavaThread* t = Threads::first(); t; t = t->next()) {
(expected_active) ? "TRUE" : "FALSE"); gclog_or_tty->print_cr(" Thread \"%s\" queue: %s", t->name(),
for (JavaThread* t = first; t; t = t->next()) { t->satb_mark_queue().is_active() ? "ACTIVE" : "INACTIVE");
bool active = t->satb_mark_queue().is_active();
gclog_or_tty->print_cr(" thread %s, active is %s",
t->name(), (active) ? "TRUE" : "FALSE");
} }
gclog_or_tty->print_cr(" Shared queue: %s",
shared_satb_queue()->is_active() ? "ACTIVE" : "INACTIVE");
} }
#endif // ASSERT
void SATBMarkQueueSet::set_active_all_threads(bool b, void SATBMarkQueueSet::verify_active_states(bool expected_active) {
bool expected_active) { // Verify queue set state
assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); if (is_active() != expected_active) {
JavaThread* first = Threads::first(); dump_active_states(expected_active);
guarantee(false, "SATB queue set has an unexpected active state");
}
#ifdef ASSERT // Verify thread queue states
if (_all_active != expected_active) { for (JavaThread* t = Threads::first(); t; t = t->next()) {
dump_active_values(first, expected_active); if (t->satb_mark_queue().is_active() != expected_active) {
dump_active_states(expected_active);
// I leave this here as a guarantee, instead of an assert, so guarantee(false, "Thread SATB queue has an unexpected active state");
// that it will still be compiled in if we choose to uncomment }
// the #ifdef ASSERT in a product build. The whole block is
// within an #ifdef ASSERT so the guarantee will not be compiled
// in a product build anyway.
guarantee(false,
"SATB queue set has an unexpected active value");
} }
// Verify shared queue state
if (shared_satb_queue()->is_active() != expected_active) {
dump_active_states(expected_active);
guarantee(false, "Shared SATB queue has an unexpected active state");
}
}
#endif // ASSERT #endif // ASSERT
_all_active = b;
for (JavaThread* t = first; t; t = t->next()) { void SATBMarkQueueSet::set_active_all_threads(bool active, bool expected_active) {
assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint.");
#ifdef ASSERT #ifdef ASSERT
bool active = t->satb_mark_queue().is_active(); verify_active_states(expected_active);
if (active != expected_active) {
dump_active_values(first, expected_active);
// I leave this here as a guarantee, instead of an assert, so
// that it will still be compiled in if we choose to uncomment
// the #ifdef ASSERT in a product build. The whole block is
// within an #ifdef ASSERT so the guarantee will not be compiled
// in a product build anyway.
guarantee(false,
"thread has an unexpected active value in its SATB queue");
}
#endif // ASSERT #endif // ASSERT
t->satb_mark_queue().set_active(b); _all_active = active;
for (JavaThread* t = Threads::first(); t; t = t->next()) {
t->satb_mark_queue().set_active(active);
} }
shared_satb_queue()->set_active(active);
} }
void SATBMarkQueueSet::filter_thread_buffers() { void SATBMarkQueueSet::filter_thread_buffers() {
......
...@@ -87,7 +87,8 @@ class SATBMarkQueueSet: public PtrQueueSet { ...@@ -87,7 +87,8 @@ class SATBMarkQueueSet: public PtrQueueSet {
bool apply_closure_to_completed_buffer_work(bool par, int worker); bool apply_closure_to_completed_buffer_work(bool par, int worker);
#ifdef ASSERT #ifdef ASSERT
void dump_active_values(JavaThread* first, bool expected_active); void dump_active_states(bool expected_active);
void verify_active_states(bool expected_active);
#endif // ASSERT #endif // ASSERT
public: public:
...@@ -99,11 +100,11 @@ public: ...@@ -99,11 +100,11 @@ public:
static void handle_zero_index_for_thread(JavaThread* t); static void handle_zero_index_for_thread(JavaThread* t);
// Apply "set_active(b)" to all Java threads' SATB queues. It should be // Apply "set_active(active)" to all SATB queues in the set. It should be
// called only with the world stopped. The method will assert that the // called only with the world stopped. The method will assert that the
// SATB queues of all threads it visits, as well as the SATB queue // SATB queues of all threads it visits, as well as the SATB queue
// set itself, has an active value same as expected_active. // set itself, has an active value same as expected_active.
void set_active_all_threads(bool b, bool expected_active); void set_active_all_threads(bool active, bool expected_active);
// Filter all the currently-active SATB buffers. // Filter all the currently-active SATB buffers.
void filter_thread_buffers(); void filter_thread_buffers();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册