src/share/vm/utilities/workgroup.hpp
Print this page
rev 6345 : 8040803: G1: Concurrent mark hangs when mark stack overflows
Reviewed-by: TDB
@@ -360,19 +360,21 @@
protected:
Monitor _monitor;
uint _n_workers;
uint _n_completed;
bool _should_reset;
+ bool _aborted;
Monitor* monitor() { return &_monitor; }
uint n_workers() { return _n_workers; }
uint n_completed() { return _n_completed; }
bool should_reset() { return _should_reset; }
+ bool aborted() { return _aborted; }
void zero_completed() { _n_completed = 0; }
void inc_completed() { _n_completed++; }
-
+ void set_aborted() { _aborted = true; }
void set_should_reset(bool v) { _should_reset = v; }
public:
WorkGangBarrierSync();
WorkGangBarrierSync(uint n_workers, const char* name);
@@ -381,12 +383,18 @@
// Must be called before any of the workers start running.
void set_n_workers(uint n_workers);
// Enter the barrier. A worker that enters the barrier will
// not be allowed to leave until all other threads have
- // also entered the barrier.
- void enter();
+ // also entered the barrier or the barrier is aborted.
+ // Returns false if the barrier was aborted.
+ bool enter();
+
+ // Aborts the barrier and wakes up any threads waiting for
+ // the barrier to complete. The barrier will remain in the
+ // aborted state until the next call to set_n_workers().
+ void abort();
};
// A class to manage claiming of subtasks within a group of tasks. The
// subtasks will be identified by integer indices, usually elements of an
// enumeration type.