src/share/vm/utilities/workgroup.cpp

changeset 6692
487f09bf44e0
parent 6680
78bbf4d43a14
child 6876
710a3c8b516e
child 9783
14b0d7d60628
     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.

mercurial