Index: vm/vmcore/src/init/finalize.cpp =================================================================== --- vm/vmcore/src/init/finalize.cpp (revision 453131) +++ vm/vmcore/src/init/finalize.cpp (working copy) @@ -322,6 +322,11 @@ p_TLS_vmthread->finalize_thread_flags |= FINALIZER_STARTER; TRACE2("finalize", "run_finalizers() started"); + + // saves curent thread exception risen before running finalizers + // if any and clears it to allow java to work + jthrowable cte = exn_get(); + exn_clear(); jvalue args[1]; args[0].z = false; @@ -340,6 +345,11 @@ << " while running a wakeFinalization in FinalizerThread"); exn_clear(); } + // restores curent thread exception risen before if any + if (NULL != cte) { + exn_raise_object(cte); + } + p_TLS_vmthread->finalize_thread_flags &= ~FINALIZER_STARTER; } //Objects_To_Finalize::run_finalizers @@ -421,6 +431,11 @@ args[0].l = (jobject) handle; + // saves curent thread exception risen before enqueuing references + // if any and clears it to allow java to work + jthrowable cte = exn_get(); + exn_clear(); + while(true) { tmn_suspend_disable(); ManagedObject* object = remove_object(); @@ -428,6 +443,10 @@ tmn_suspend_enable(); if (object == NULL) { + // restores curent thread exception risen before if any + if (NULL != cte) { + exn_raise_object(cte); + } return; } tmn_suspend_disable(); @@ -452,6 +471,10 @@ exn_clear(); } } + // restores curent thread exception risen before if any + if (NULL != cte) { + exn_raise_object(cte); + } TRACE2("ref", "enqueue_references() completed"); } //Objects_To_Finalize::notify_reference_queues