src/share/vm/gc_implementation/g1/satbQueue.cpp
Print this page
rev 2585 : [mq]: g1-reference-processing
*** 27,36 ****
--- 27,37 ----
#include "gc_implementation/g1/satbQueue.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/sharedHeap.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/thread.hpp"
+ #include "runtime/vmThread.hpp"
// This method removes entries from an SATB buffer that will not be
// useful to the concurrent marking threads. An entry is removed if it
// satisfies one of the following conditions:
//
*** 250,262 ****
for(JavaThread* t = Threads::first(); t; t = t->next()) {
if (t->claim_oops_do(true, parity)) {
t->satb_mark_queue().apply_closure(_par_closures[worker]);
}
}
! // We'll have worker 0 do this one.
! if (worker == 0) {
! shared_satb_queue()->apply_closure(_par_closures[0]);
}
}
bool SATBMarkQueueSet::apply_closure_to_completed_buffer_work(bool par,
int worker) {
--- 251,272 ----
for(JavaThread* t = Threads::first(); t; t = t->next()) {
if (t->claim_oops_do(true, parity)) {
t->satb_mark_queue().apply_closure(_par_closures[worker]);
}
}
!
! // We also need to claim the VMThread so that its parity is updated
! // otherwise the next call to Thread::possibly_parallel_oops_do inside
! // a StrongRootsScope might skip the VMThread because it has a stale
! // parity that matches the parity set by the StrongRootsScope
! //
! // Whichever worker succeeds in claiming the VMThread gets to do
! // the shared queue.
!
! VMThread* vmt = VMThread::vm_thread();
! if (vmt->claim_oops_do(true, parity)) {
! shared_satb_queue()->apply_closure(_par_closures[worker]);
}
}
bool SATBMarkQueueSet::apply_closure_to_completed_buffer_work(bool par,
int worker) {