--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Sun May 11 16:35:43 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed May 14 13:32:44 2014 +0200
@@ -978,7 +978,9 @@
if (concurrent()) {
SuspendibleThreadSet::leave();
}
- _first_overflow_barrier_sync.enter();
+
+ bool barrier_aborted = !_first_overflow_barrier_sync.enter();
+
if (concurrent()) {
SuspendibleThreadSet::join();
}
@@ -986,7 +988,17 @@
// more work
if (verbose_low()) {
- gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id);
+ if (barrier_aborted) {
+ gclog_or_tty->print_cr("[%u] aborted first barrier", worker_id);
+ } else {
+ gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id);
+ }
+ }
+
+ if (barrier_aborted) {
+ // If the barrier aborted we ignore the overflow condition and
+ // just abort the whole marking phase as quickly as possible.
+ return;
}
// If we're executing the concurrent phase of marking, reset the marking
@@ -1026,14 +1038,20 @@
if (concurrent()) {
SuspendibleThreadSet::leave();
}
- _second_overflow_barrier_sync.enter();
+
+ bool barrier_aborted = !_second_overflow_barrier_sync.enter();
+
if (concurrent()) {
SuspendibleThreadSet::join();
}
// at this point everything should be re-initialized and ready to go
if (verbose_low()) {
- gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id);
+ if (barrier_aborted) {
+ gclog_or_tty->print_cr("[%u] aborted second barrier", worker_id);
+ } else {
+ gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id);
+ }
}
}
@@ -3240,6 +3258,8 @@
for (uint i = 0; i < _max_worker_id; ++i) {
_tasks[i]->clear_region_fields();
}
+ _first_overflow_barrier_sync.abort();
+ _second_overflow_barrier_sync.abort();
_has_aborted = true;
SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();