8004903: VMThread::execute() calls Thread::check_for_valid_safepoint_state() on concurrent VM ops

Check_for_valid_safepoint_state() only applies to blocking VM ops

Reviewed-by: acorn, dholmes, dice, sspitsyn
This commit is contained in:
Karen Kinnear 2013-01-22 05:57:18 -08:00 committed by Daniel D. Daugherty
parent 98c357abf8
commit bc751c3469

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -570,7 +570,11 @@ void VMThread::execute(VM_Operation* op) {
if (!t->is_VM_thread()) {
SkipGCALot sgcalot(t); // avoid re-entrant attempts to gc-a-lot
// JavaThread or WatcherThread
t->check_for_valid_safepoint_state(true);
bool concurrent = op->evaluate_concurrently();
// only blocking VM operations need to verify the caller's safepoint state:
if (!concurrent) {
t->check_for_valid_safepoint_state(true);
}
// New request from Java thread, evaluate prologue
if (!op->doit_prologue()) {
@ -582,7 +586,6 @@ void VMThread::execute(VM_Operation* op) {
// It does not make sense to execute the epilogue, if the VM operation object is getting
// deallocated by the VM thread.
bool concurrent = op->evaluate_concurrently();
bool execute_epilog = !op->is_cheap_allocated();
assert(!concurrent || op->is_cheap_allocated(), "concurrent => cheap_allocated");