You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by xl...@apache.org on 2007/04/19 11:39:47 UTC

svn commit: r530351 - /harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp

Author: xli
Date: Thu Apr 19 02:39:46 2007
New Revision: 530351

URL: http://svn.apache.org/viewvc?view=rev&rev=530351
Log:
HARMONY-3705 : the timing of finalizer is critical to pass the test. 

Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp?view=diff&rev=530351&r1=530350&r2=530351
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Thu Apr 19 02:39:46 2007
@@ -153,17 +153,22 @@
     return wait_time;
 }
 
-static void wait_finalization_end(void)
+static void wait_finalization_end(Boolean must_wait)
 {
     hymutex_lock(&fin_thread_info->end_mutex);
     unsigned int fin_obj_num = vm_get_finalizable_objects_quantity();
     while(fin_thread_info->working_thread_num || fin_obj_num){
-        unsigned int wait_time = restrict_wait_time(fin_obj_num + 1000, FIN_MAX_WAIT_TIME << 7);
+        unsigned int wait_time = restrict_wait_time(fin_obj_num, FIN_MAX_WAIT_TIME << 7);
         atomic_inc32(&fin_thread_info->end_waiting_num);
         IDATA status = hycond_wait_timed(&fin_thread_info->end_cond, &fin_thread_info->end_mutex, (I_64)wait_time, 0);
         atomic_dec32(&fin_thread_info->end_waiting_num);
-        if(status != TM_ERROR_NONE) break;
-        fin_obj_num = vm_get_finalizable_objects_quantity();
+        unsigned int temp = vm_get_finalizable_objects_quantity();
+        if(must_wait){
+            if((status != TM_ERROR_NONE) && (fin_obj_num == temp)) break;
+        }else{
+            if(status != TM_ERROR_NONE) break; 
+        }
+        fin_obj_num = temp;     
     }
     hymutex_unlock(&fin_thread_info->end_mutex);
 }
@@ -174,7 +179,7 @@
     assert(stat == TM_ERROR_NONE);
     
     if(wait)
-        wait_finalization_end();
+        wait_finalization_end(true);
 }
 
 static void notify_finalization_end(void)