7114303: G1: assert(_g1->mark_in_progress()) failed: shouldn't be here otherwise

Race between the VM thread reading G1CollectedHeap::_mark_in_progress and it being set by the concurrent mark thread when concurrent marking is aborted by a full GC. Have the concurrent mark thread join the SuspendibleThreadSet before changing the marking state.

Reviewed-by: tonyp, brutisso
This commit is contained in:
John Cuthbertson 2011-11-28 09:49:05 -08:00
parent 15070123fa
commit 861168c82e
3 changed files with 5 additions and 9 deletions

View file

@ -191,7 +191,11 @@ void ConcurrentMarkThread::run() {
VM_CGC_Operation op(&cl_cl, verbose_str);
VMThread::execute(&op);
} else {
// We don't want to update the marking status if a GC pause
// is already underway.
_sts.join();
g1h->set_marking_complete();
_sts.leave();
}
// Check if cleanup set the free_regions_coming flag. If it