1.1 --- a/src/share/vm/utilities/workgroup.cpp Thu Apr 17 18:47:15 2014 +0200 1.2 +++ b/src/share/vm/utilities/workgroup.cpp Wed May 14 13:32:44 2014 +0200 1.3 @@ -378,21 +378,22 @@ 1.4 1.5 WorkGangBarrierSync::WorkGangBarrierSync() 1.6 : _monitor(Mutex::safepoint, "work gang barrier sync", true), 1.7 - _n_workers(0), _n_completed(0), _should_reset(false) { 1.8 + _n_workers(0), _n_completed(0), _should_reset(false), _aborted(false) { 1.9 } 1.10 1.11 WorkGangBarrierSync::WorkGangBarrierSync(uint n_workers, const char* name) 1.12 : _monitor(Mutex::safepoint, name, true), 1.13 - _n_workers(n_workers), _n_completed(0), _should_reset(false) { 1.14 + _n_workers(n_workers), _n_completed(0), _should_reset(false), _aborted(false) { 1.15 } 1.16 1.17 void WorkGangBarrierSync::set_n_workers(uint n_workers) { 1.18 - _n_workers = n_workers; 1.19 - _n_completed = 0; 1.20 + _n_workers = n_workers; 1.21 + _n_completed = 0; 1.22 _should_reset = false; 1.23 + _aborted = false; 1.24 } 1.25 1.26 -void WorkGangBarrierSync::enter() { 1.27 +bool WorkGangBarrierSync::enter() { 1.28 MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag); 1.29 if (should_reset()) { 1.30 // The should_reset() was set and we are the first worker to enter 1.31 @@ -415,10 +416,17 @@ 1.32 set_should_reset(true); 1.33 monitor()->notify_all(); 1.34 } else { 1.35 - while (n_completed() != n_workers()) { 1.36 + while (n_completed() != n_workers() && !aborted()) { 1.37 monitor()->wait(/* no_safepoint_check */ true); 1.38 } 1.39 } 1.40 + return !aborted(); 1.41 +} 1.42 + 1.43 +void WorkGangBarrierSync::abort() { 1.44 + MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag); 1.45 + set_aborted(); 1.46 + monitor()->notify_all(); 1.47 } 1.48 1.49 // SubTasksDone functions.