Index: vmcore/include/ref_enqueue_thread.h =================================================================== --- vmcore/include/ref_enqueue_thread.h (revision 539993) +++ vmcore/include/ref_enqueue_thread.h (working copy) @@ -44,6 +44,8 @@ extern void ref_enqueue_thread_init(JavaVM *java_vm); extern void ref_enqueue_shutdown(void); extern void activate_ref_enqueue_thread(Boolean wait); +extern void inform_native_handler_enqueue_start(void); +extern void inform_native_handler_enqueue_end(void); inline void native_sync_enqueue_references(void) { activate_ref_enqueue_thread(TRUE); }; Index: vmcore/src/init/finalize.cpp =================================================================== --- vmcore/src/init/finalize.cpp (revision 539993) +++ vmcore/src/init/finalize.cpp (working copy) @@ -553,6 +553,7 @@ exn_clear(); while(true) { + inform_native_handler_enqueue_start(); tmn_suspend_disable(); ManagedObject* object = remove_object(); handle->object = object; @@ -563,6 +564,7 @@ if (NULL != cte) { exn_raise_object(cte); } + inform_native_handler_enqueue_end(); return; } tmn_suspend_disable(); @@ -575,6 +577,7 @@ assert(enqueue); vm_execute_java_method_array( (jmethodID) enqueue, &r, args); tmn_suspend_enable(); + inform_native_handler_enqueue_end(); #ifndef NDEBUG if (exn_raised()) { Index: vmcore/src/init/ref_enqueue_thread.cpp =================================================================== --- vmcore/src/init/ref_enqueue_thread.cpp (revision 539993) +++ vmcore/src/init/ref_enqueue_thread.cpp (working copy) @@ -28,6 +28,7 @@ static Boolean native_ref_thread_flag = FALSE; static Ref_Enqueue_Thread_Info *ref_thread_info = NULL; +static volatile Boolean enqueue_start = FALSE; Boolean get_native_ref_enqueue_thread_flag() @@ -89,6 +90,12 @@ void wait_native_ref_thread_detached(void) { while(ref_thread_info->thread_attached){hythread_yield();} } +void inform_native_handler_enqueue_start(void) +{ enqueue_start = TRUE; } + +void inform_native_handler_enqueue_end(void) +{ enqueue_start = FALSE; } + static void wait_ref_enqueue_end(void) { hymutex_lock(&ref_thread_info->end_mutex); @@ -98,7 +105,7 @@ atomic_inc32(&ref_thread_info->end_waiting_num); IDATA status = hycond_wait_timed(&ref_thread_info->end_cond, &ref_thread_info->end_mutex, (I_64)wait_time, 0); atomic_dec32(&ref_thread_info->end_waiting_num); - if(status != TM_ERROR_NONE) break; + if(status != TM_ERROR_NONE && enqueue_start == FALSE) break; ref_num = vm_get_references_quantity(); } while(ref_num); hymutex_unlock(&ref_thread_info->end_mutex);