# HG changeset patch # User never # Date 1262718894 28800 # Node ID b6f06e395428cbc93f80d42090c9bae525b7924c # Parent e66fd840cb6ba45f28df478c457d9fe7b9dc9b19 6908267: Zero fails to unlock synchronized native methods on exception Reviewed-by: never Contributed-by: Gary Benson diff -r e66fd840cb6b -r b6f06e395428 src/cpu/zero/vm/cppInterpreter_zero.cpp --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Mon Jan 04 18:38:08 2010 +0100 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Jan 05 11:14:54 2010 -0800 @@ -245,7 +245,7 @@ if (handlerAddr == NULL) { CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method)); if (HAS_PENDING_EXCEPTION) - goto unwind_and_return; + goto unlock_unwind_and_return; handlerAddr = method->signature_handler(); assert(handlerAddr != NULL, "eh?"); @@ -254,7 +254,7 @@ CALL_VM_NOCHECK(handlerAddr = InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL)); if (HAS_PENDING_EXCEPTION) - goto unwind_and_return; + goto unlock_unwind_and_return; } handler = \ InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr); @@ -365,10 +365,10 @@ // Reset handle block thread->active_handles()->clear(); - // Unlock if necessary. It seems totally wrong that this - // is skipped in the event of an exception but apparently - // the template interpreter does this so we do too. - if (monitor && !HAS_PENDING_EXCEPTION) { + unlock_unwind_and_return: + + // Unlock if necessary + if (monitor) { BasicLock *lock = monitor->lock(); markOop header = lock->displaced_header(); oop rcvr = monitor->obj();