src/share/vm/utilities/workgroup.cpp
Print this page
rev 6345 : 8040803: G1: Concurrent mark hangs when mark stack overflows
Reviewed-by: TDB
*** 374,398 ****
// *** WorkGangBarrierSync
WorkGangBarrierSync::WorkGangBarrierSync()
: _monitor(Mutex::safepoint, "work gang barrier sync", true),
! _n_workers(0), _n_completed(0), _should_reset(false) {
}
WorkGangBarrierSync::WorkGangBarrierSync(uint n_workers, const char* name)
: _monitor(Mutex::safepoint, name, true),
! _n_workers(n_workers), _n_completed(0), _should_reset(false) {
}
void WorkGangBarrierSync::set_n_workers(uint n_workers) {
_n_workers = n_workers;
_n_completed = 0;
_should_reset = false;
}
! void WorkGangBarrierSync::enter() {
MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag);
if (should_reset()) {
// The should_reset() was set and we are the first worker to enter
// the sync barrier. We will zero the n_completed() count which
// effectively resets the barrier.
--- 374,399 ----
// *** WorkGangBarrierSync
WorkGangBarrierSync::WorkGangBarrierSync()
: _monitor(Mutex::safepoint, "work gang barrier sync", true),
! _n_workers(0), _n_completed(0), _should_reset(false), _aborted(false) {
}
WorkGangBarrierSync::WorkGangBarrierSync(uint n_workers, const char* name)
: _monitor(Mutex::safepoint, name, true),
! _n_workers(n_workers), _n_completed(0), _should_reset(false), _aborted(false) {
}
void WorkGangBarrierSync::set_n_workers(uint n_workers) {
_n_workers = n_workers;
_n_completed = 0;
_should_reset = false;
+ _aborted = false;
}
! bool WorkGangBarrierSync::enter() {
MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag);
if (should_reset()) {
// The should_reset() was set and we are the first worker to enter
// the sync barrier. We will zero the n_completed() count which
// effectively resets the barrier.
*** 411,424 ****
// should_reset() flag and the barrier will be reset the first
// time a worker enters it again.
set_should_reset(true);
monitor()->notify_all();
} else {
! while (n_completed() != n_workers()) {
monitor()->wait(/* no_safepoint_check */ true);
}
}
}
// SubTasksDone functions.
SubTasksDone::SubTasksDone(uint n) :
--- 412,432 ----
// should_reset() flag and the barrier will be reset the first
// time a worker enters it again.
set_should_reset(true);
monitor()->notify_all();
} else {
! while (n_completed() != n_workers() && !aborted()) {
monitor()->wait(/* no_safepoint_check */ true);
}
}
+ return !aborted();
+ }
+
+ void WorkGangBarrierSync::abort() {
+ MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag);
+ set_aborted();
+ monitor()->notify_all();
}
// SubTasksDone functions.
SubTasksDone::SubTasksDone(uint n) :