--- old/src/hotspot/share/gc/shared/satbMarkQueue.cpp 2019-02-25 16:57:01.875254218 -0500 +++ new/src/hotspot/share/gc/shared/satbMarkQueue.cpp 2019-02-25 16:57:01.479233339 -0500 @@ -41,7 +41,7 @@ // 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 must be done in the collector-specific - // BarrierSet::on_thread_attach() implementation. + // BarrierSet thread attachment protocol. PtrQueue(qset, permanent, false /* active */) { } @@ -57,9 +57,6 @@ // use the buffer as-is, instead of enqueueing and replacing it. bool SATBMarkQueue::should_enqueue_buffer() { - assert(_lock == NULL || _lock->owned_by_self(), - "we should have taken the lock before calling this"); - // This method should only be called if there is a non-NULL buffer // that is full. assert(index() == 0, "pre-condition"); @@ -107,18 +104,15 @@ SATBMarkQueueSet::SATBMarkQueueSet() : PtrQueueSet(), - _shared_satb_queue(this, true /* permanent */), _buffer_enqueue_threshold(0) {} void SATBMarkQueueSet::initialize(Monitor* cbl_mon, BufferNode::Allocator* allocator, size_t process_completed_buffers_threshold, - uint buffer_enqueue_threshold_percentage, - Mutex* lock) { + uint buffer_enqueue_threshold_percentage) { PtrQueueSet::initialize(cbl_mon, allocator); set_process_completed_buffers_threshold(process_completed_buffers_threshold); - _shared_satb_queue.set_lock(lock); assert(buffer_size() != 0, "buffer size not initialized"); // Minimum threshold of 1 ensures enqueuing of completely full buffers. size_t size = buffer_size(); @@ -131,32 +125,43 @@ log_error(gc, verify)("Expected SATB active state: %s", expected_active ? "ACTIVE" : "INACTIVE"); log_error(gc, verify)("Actual SATB active states:"); log_error(gc, verify)(" Queue set: %s", is_active() ? "ACTIVE" : "INACTIVE"); - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - log_error(gc, verify)(" Thread \"%s\" queue: %s", t->name(), satb_queue_for_thread(t).is_active() ? "ACTIVE" : "INACTIVE"); - } - log_error(gc, verify)(" Shared queue: %s", shared_satb_queue()->is_active() ? "ACTIVE" : "INACTIVE"); + + class DumpThreadStateClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + public: + DumpThreadStateClosure(SATBMarkQueueSet* qset) : _qset(qset) {} + virtual void do_thread(Thread* t) { + SATBMarkQueue& queue = _qset->satb_queue_for_thread(t); + log_error(gc, verify)(" Thread \"%s\" queue: %s", + t->name(), + queue.is_active() ? "ACTIVE" : "INACTIVE"); + } + } closure(this); + Threads::threads_do(&closure); } void SATBMarkQueueSet::verify_active_states(bool expected_active) { // Verify queue set state if (is_active() != expected_active) { dump_active_states(expected_active); - guarantee(false, "SATB queue set has an unexpected active state"); + fatal("SATB queue set has an unexpected active state"); } // Verify thread queue states - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - if (satb_queue_for_thread(t).is_active() != expected_active) { - dump_active_states(expected_active); - guarantee(false, "Thread SATB queue has an unexpected active state"); + class VerifyThreadStatesClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + bool _expected_active; + public: + VerifyThreadStatesClosure(SATBMarkQueueSet* qset, bool expected_active) : + _qset(qset), _expected_active(expected_active) {} + virtual void do_thread(Thread* t) { + if (_qset->satb_queue_for_thread(t).is_active() != _expected_active) { + _qset->dump_active_states(_expected_active); + fatal("Thread SATB queue has an unexpected active state"); + } } - } - - // 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"); - } + } closure(this, expected_active); + Threads::threads_do(&closure); } #endif // ASSERT @@ -166,17 +171,30 @@ verify_active_states(expected_active); #endif // ASSERT _all_active = active; - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - satb_queue_for_thread(t).set_active(active); - } - shared_satb_queue()->set_active(active); + + class SetThreadActiveClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + bool _active; + public: + SetThreadActiveClosure(SATBMarkQueueSet* qset, bool active) : + _qset(qset), _active(active) {} + virtual void do_thread(Thread* t) { + _qset->satb_queue_for_thread(t).set_active(_active); + } + } closure(this, active); + Threads::threads_do(&closure); } void SATBMarkQueueSet::filter_thread_buffers() { - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - satb_queue_for_thread(t).filter(); - } - shared_satb_queue()->filter(); + class FilterThreadBufferClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + public: + FilterThreadBufferClosure(SATBMarkQueueSet* qset) : _qset(qset) {} + virtual void do_thread(Thread* t) { + _qset->satb_queue_for_thread(t).filter(); + } + } closure(this); + Threads::threads_do(&closure); } bool SATBMarkQueueSet::apply_closure_to_completed_buffer(SATBBufferClosure* cl) { @@ -216,23 +234,36 @@ i += 1; } - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - os::snprintf(buffer, SATB_PRINTER_BUFFER_SIZE, "Thread: %s", t->name()); - satb_queue_for_thread(t).print(buffer); - } - - shared_satb_queue()->print("Shared"); + class PrintThreadClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + char* _buffer; + + public: + PrintThreadClosure(SATBMarkQueueSet* qset, char* buffer) : + _qset(qset), _buffer(buffer) {} + + virtual void do_thread(Thread* t) { + os::snprintf(_buffer, SATB_PRINTER_BUFFER_SIZE, "Thread: %s", t->name()); + _qset->satb_queue_for_thread(t).print(_buffer); + } + } closure(this, buffer); + Threads::threads_do(&closure); tty->cr(); } #endif // PRODUCT void SATBMarkQueueSet::abandon_partial_marking() { - abandon_completed_buffers(); assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); - // So we can safely manipulate these queues. - for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) { - satb_queue_for_thread(t).reset(); - } - shared_satb_queue()->reset(); + abandon_completed_buffers(); + + class AbandonThreadQueueClosure : public ThreadClosure { + SATBMarkQueueSet* _qset; + public: + AbandonThreadQueueClosure(SATBMarkQueueSet* qset) : _qset(qset) {} + virtual void do_thread(Thread* t) { + _qset->satb_queue_for_thread(t).reset(); + } + } closure(this); + Threads::threads_do(&closure); }