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/13 07:30:16 UTC

svn commit: r528360 - in /harmony/enhanced/drlvm/trunk/vm/vmcore: include/ src/init/ src/kernel_classes/native/

Author: xli
Date: Thu Apr 12 22:30:15 2007
New Revision: 528360

URL: http://svn.apache.org/viewvc?view=rev&rev=528360
Log:
HARMONY-3637 : fix bug to satisfy the classlib tests requirement on the semantics of System.runFinalization().

Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_FinalizerThread.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h?view=diff&rev=528360&r1=528359&r2=528360
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h Thu Apr 12 22:30:15 2007
@@ -66,7 +66,9 @@
 extern void finalizer_threads_init(JavaVM *java_vm);
 extern void finalizer_shutdown(Boolean start_finalization_on_exit);
 extern void activate_finalizer_threads(Boolean wait);
-extern void vmmemory_manager_runfinalization(void);
+
+inline void native_sync_run_finalization(void)
+{ activate_finalizer_threads(TRUE); };
 
 
 extern void vm_heavy_finalizer_resume_mutator(void);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h?view=diff&rev=528360&r1=528359&r2=528360
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h Thu Apr 12 22:30:15 2007
@@ -33,13 +33,19 @@
 
 typedef struct Ref_Enqueue_Thread_Info {
     hysem_t pending_sem;
+    hycond_t end_cond;      // ref enqueue end condition variable
+    hymutex_t end_mutex;    // ref enqueue end mutex
     Boolean shutdown;
     volatile unsigned int thread_attached;
+    volatile unsigned int end_waiting_num;  // thread num waiting for finalization end
 }Ref_Enqueue_Thread_Info;
 
 
 extern void ref_enqueue_thread_init(JavaVM *java_vm);
 extern void ref_enqueue_shutdown(void);
-extern void activate_ref_enqueue_thread(void);
+extern void activate_ref_enqueue_thread(Boolean wait);
+
+inline void native_sync_enqueue_references(void)
+{ activate_ref_enqueue_thread(TRUE); };
 
 #endif // _REF_ENQUEUE_THREAD_H_

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp?view=diff&rev=528360&r1=528359&r2=528360
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp Thu Apr 12 22:30:15 2007
@@ -674,14 +674,14 @@
 void vm_activate_ref_enqueue_thread()
 {
     if(get_native_ref_enqueue_thread_flag())
-        activate_ref_enqueue_thread();
+        activate_ref_enqueue_thread(FALSE);
 }
 
 void vm_enqueue_references()
 {
     /* BEGIN: modified for NATIVE REFERENCE ENQUEUE THREAD */
     if(get_native_ref_enqueue_thread_flag())
-        activate_ref_enqueue_thread();
+        activate_ref_enqueue_thread(FALSE);
     else
         references_to_enqueue.enqueue_references();
     /* END: modified for NATIVE REFERENCE ENQUEUE THREAD */

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=528360&r1=528359&r2=528360
==============================================================================
--- 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 12 22:30:15 2007
@@ -179,11 +179,6 @@
         hycond_notify_all(&fin_thread_info->end_cond);
 }
 
-void vmmemory_manager_runfinalization(void)
-{
-    activate_finalizer_threads(TRUE);
-}
-
 static void wait_pending_finalizer(void)
 {
     IDATA stat = hysem_wait(fin_thread_info->pending_sem);
@@ -278,6 +273,7 @@
     if(gc_clear_mutator_block_flag())
         hycond_notify_all(&fin_thread_info->mutator_block_cond);
 }
+
 
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp?view=diff&rev=528360&r1=528359&r2=528360
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp Thu Apr 12 22:30:15 2007
@@ -52,6 +52,11 @@
     IDATA status = hysem_create(&ref_thread_info->pending_sem, 0, REF_ENQUEUE_THREAD_NUM);
     assert(status == TM_ERROR_NONE);
     
+    status = hycond_create(&ref_thread_info->end_cond);
+    assert(status == TM_ERROR_NONE);
+    status = hymutex_create(&ref_thread_info->end_mutex, TM_MUTEX_DEFAULT);
+    assert(status == TM_ERROR_NONE);
+    
     void **args = (void **)STD_MALLOC(sizeof(void *));
     args[0] = (void *)java_vm;
     status = hythread_create(NULL, 0, REF_ENQUEUE_THREAD_PRIORITY, 0, (hythread_entrypoint_t)ref_enqueue_thread_func, args);
@@ -63,7 +68,7 @@
 void ref_enqueue_shutdown(void)
 {
     ref_thread_info->shutdown = TRUE;
-    activate_ref_enqueue_thread();
+    activate_ref_enqueue_thread(FALSE);
 }
 
 static uint32 atomic_inc32(volatile apr_uint32_t *mem)
@@ -79,15 +84,39 @@
 { atomic_dec32(&ref_thread_info->thread_attached); }
 
 static void wait_ref_thread_attached(void)
-{ while(ref_thread_info->thread_attached == 0); }
+{ while(ref_thread_info->thread_attached < REF_ENQUEUE_THREAD_NUM); }
 
 void wait_native_ref_thread_detached(void)
 { while(ref_thread_info->thread_attached); }
 
-void activate_ref_enqueue_thread(void)
+static void wait_ref_enqueue_end(void)
+{
+    hymutex_lock(&ref_thread_info->end_mutex);
+    unsigned int ref_num = vm_get_references_quantity();
+    do {
+        unsigned int wait_time = ref_num + 100;
+        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;
+        ref_num = vm_get_references_quantity();
+    } while(ref_num);
+    hymutex_unlock(&ref_thread_info->end_mutex);
+}
+
+void activate_ref_enqueue_thread(Boolean wait)
 {
     IDATA stat = hysem_set(ref_thread_info->pending_sem, REF_ENQUEUE_THREAD_NUM);
     assert(stat == TM_ERROR_NONE);
+    
+    if(wait)
+        wait_ref_enqueue_end();
+}
+
+static void notify_ref_enqueue_end(void)
+{
+    if(vm_get_references_quantity()==0)
+        hycond_notify_all(&ref_thread_info->end_cond);
 }
 
 static void wait_pending_reference(void)
@@ -122,6 +151,9 @@
         
         /* do the real reference enqueue work */
         vm_ref_enqueue_func();
+        
+        if(ref_thread_info->end_waiting_num)
+            notify_ref_enqueue_end();
         
         if(ref_thread_info->shutdown)
             break;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_FinalizerThread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_FinalizerThread.cpp?view=diff&rev=528360&r1=528359&r2=528360
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_FinalizerThread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_FinalizerThread.cpp Thu Apr 12 22:30:15 2007
@@ -36,6 +36,7 @@
 
 /* added for NATIVE FINALIZER THREAD */
 #include "finalizer_thread.h"
+#include "ref_enqueue_thread.h"
 
 /**
  * Implements getObject(..) method.
@@ -116,10 +117,10 @@
 JNIEXPORT void JNICALL Java_java_lang_FinalizerThread_runFinalizationInNativeFinalizerThreads
   (JNIEnv *, jclass)
 {
-    vm_enqueue_references();
+    native_sync_enqueue_references();
     
     // Do finalization in dedicated native finalizer threads.
-    vmmemory_manager_runfinalization();
+    native_sync_run_finalization();
 }
 
 /*