提交 a5490f02 编写于 作者: T twisti

7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed

Reviewed-by: jrose, coleenp, jmasa, kvn
上级 505a97ea
...@@ -734,6 +734,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) { ...@@ -734,6 +734,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) {
} // end JvmtiHideSingleStepping } // end JvmtiHideSingleStepping
cache_entry(thread)->set_method_handle( cache_entry(thread)->set_method_handle(
pool,
info.resolved_method(), info.resolved_method(),
info.resolved_appendix(), info.resolved_appendix(),
pool->resolved_references()); pool->resolved_references());
...@@ -761,6 +762,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) { ...@@ -761,6 +762,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) {
ConstantPoolCacheEntry* cp_cache_entry = pool->invokedynamic_cp_cache_entry_at(index); ConstantPoolCacheEntry* cp_cache_entry = pool->invokedynamic_cp_cache_entry_at(index);
cp_cache_entry->set_dynamic_call( cp_cache_entry->set_dynamic_call(
pool,
info.resolved_method(), info.resolved_method(),
info.resolved_appendix(), info.resolved_appendix(),
pool->resolved_references()); pool->resolved_references());
......
...@@ -243,17 +243,20 @@ void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index) ...@@ -243,17 +243,20 @@ void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index)
} }
void ConstantPoolCacheEntry::set_method_handle(methodHandle adapter, Handle appendix, void ConstantPoolCacheEntry::set_method_handle(constantPoolHandle cpool,
methodHandle adapter, Handle appendix,
objArrayHandle resolved_references) { objArrayHandle resolved_references) {
set_method_handle_common(Bytecodes::_invokehandle, adapter, appendix, resolved_references); set_method_handle_common(cpool, Bytecodes::_invokehandle, adapter, appendix, resolved_references);
} }
void ConstantPoolCacheEntry::set_dynamic_call(methodHandle adapter, Handle appendix, void ConstantPoolCacheEntry::set_dynamic_call(constantPoolHandle cpool,
methodHandle adapter, Handle appendix,
objArrayHandle resolved_references) { objArrayHandle resolved_references) {
set_method_handle_common(Bytecodes::_invokedynamic, adapter, appendix, resolved_references); set_method_handle_common(cpool, Bytecodes::_invokedynamic, adapter, appendix, resolved_references);
} }
void ConstantPoolCacheEntry::set_method_handle_common(Bytecodes::Code invoke_code, void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
Bytecodes::Code invoke_code,
methodHandle adapter, methodHandle adapter,
Handle appendix, Handle appendix,
objArrayHandle resolved_references) { objArrayHandle resolved_references) {
...@@ -261,28 +264,23 @@ void ConstantPoolCacheEntry::set_method_handle_common(Bytecodes::Code invoke_cod ...@@ -261,28 +264,23 @@ void ConstantPoolCacheEntry::set_method_handle_common(Bytecodes::Code invoke_cod
// There are three words to update: flags, refs[f2], f1 (in that order). // There are three words to update: flags, refs[f2], f1 (in that order).
// Writers must store all other values before f1. // Writers must store all other values before f1.
// Readers must test f1 first for non-null before reading other fields. // Readers must test f1 first for non-null before reading other fields.
// Competing writers must acquire exclusive access on the first // Competing writers must acquire exclusive access via a lock.
// write, to flags, using a compare/exchange. // A losing writer waits on the lock until the winner writes f1 and leaves
// A losing writer to flags must spin until the winner writes f1, // the lock, so that when the losing writer returns, he can use the linked
// so that when he returns, he can use the linked cache entry. // cache entry.
MonitorLockerEx ml(cpool->lock());
if (!is_f1_null()) {
return;
}
bool has_appendix = appendix.not_null(); bool has_appendix = appendix.not_null();
// Write the flags. // Write the flags.
bool owner = set_method_flags(as_TosState(adapter->result_type()),
init_method_flags_atomic(as_TosState(adapter->result_type()),
((has_appendix ? 1 : 0) << has_appendix_shift) | ((has_appendix ? 1 : 0) << has_appendix_shift) |
( 1 << is_final_shift), ( 1 << is_final_shift),
adapter->size_of_parameters()); adapter->size_of_parameters());
if (!owner) {
// Somebody else is working on the same CPCE. Let them proceed.
while (is_f1_null()) {
// Pause momentarily on a low-level lock, to allow racing thread to win.
MutexLockerEx mu(Patching_lock, Mutex::_no_safepoint_check_flag);
os::yield();
}
return;
}
if (TraceInvokeDynamic) { if (TraceInvokeDynamic) {
tty->print_cr("set_method_handle bc=%d appendix="PTR_FORMAT"%s method="PTR_FORMAT" ", tty->print_cr("set_method_handle bc=%d appendix="PTR_FORMAT"%s method="PTR_FORMAT" ",
......
...@@ -221,12 +221,14 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC { ...@@ -221,12 +221,14 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
); );
void set_method_handle( void set_method_handle(
constantPoolHandle cpool, // holding constant pool (required for locking)
methodHandle method, // adapter for invokeExact, etc. methodHandle method, // adapter for invokeExact, etc.
Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.MethodType Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.MethodType
objArrayHandle resolved_references objArrayHandle resolved_references
); );
void set_dynamic_call( void set_dynamic_call(
constantPoolHandle cpool, // holding constant pool (required for locking)
methodHandle method, // adapter for this call site methodHandle method, // adapter for this call site
Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.CallSite Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.CallSite
objArrayHandle resolved_references objArrayHandle resolved_references
...@@ -248,6 +250,7 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC { ...@@ -248,6 +250,7 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
// resolution logic needs to make slightly different assessments about the // resolution logic needs to make slightly different assessments about the
// number and types of arguments. // number and types of arguments.
void set_method_handle_common( void set_method_handle_common(
constantPoolHandle cpool, // holding constant pool (required for locking)
Bytecodes::Code invoke_code, // _invokehandle or _invokedynamic Bytecodes::Code invoke_code, // _invokehandle or _invokedynamic
methodHandle adapter, // invoker method (f1) methodHandle adapter, // invoker method (f1)
Handle appendix, // appendix such as CallSite, MethodType, etc. (refs[f2]) Handle appendix, // appendix such as CallSite, MethodType, etc. (refs[f2])
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册