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/20 16:29:41 UTC

svn commit: r530824 - in /harmony/enhanced/drlvm/trunk/vm/vmcore: include/finalizer_thread.h src/init/finalizer_thread.cpp

Author: xli
Date: Fri Apr 20 07:29:40 2007
New Revision: 530824

URL: http://svn.apache.org/viewvc?view=rev&rev=530824
Log:
HARMONY-3705 : native finalizer thread initialization bug fixed

Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.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=530824&r1=530823&r2=530824
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h Fri Apr 20 07:29:40 2007
@@ -52,7 +52,7 @@
     
     hythread_t *thread_ids;
     unsigned int thread_num;
-    volatile unsigned int thread_attached_num;
+    volatile unsigned int thread_attached;
     
     volatile Boolean shutdown;
     volatile Boolean on_exit;

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=530824&r1=530823&r2=530824
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Fri Apr 20 07:29:40 2007
@@ -63,11 +63,24 @@
 }
 
 static IDATA finalizer_thread_func(void **args);
-static void wait_fin_threads_attached(void);
+
+static void set_fin_thread_attached(void)
+{ fin_thread_info->thread_attached = 1; }
+
+static void dec_fin_thread_num(void)
+{ atomic_dec32(&fin_thread_info->thread_num); }
+
+static volatile unsigned int get_fin_thread_attached(void)
+{ return fin_thread_info->thread_attached; }
+
+static void clear_fin_thread_attached(void)
+{ fin_thread_info->thread_attached = 0; }
+
+static void wait_fin_thread_attached(void)
+{ while(!fin_thread_info->thread_attached){hythread_yield();}}
 
 void finalizer_threads_init(JavaVM *java_vm)
-{
-    if(!native_fin_thread_flag)
+{   if(!native_fin_thread_flag)
         return;
     
     fin_thread_info = (Fin_Thread_Info *)STD_MALLOC(sizeof(Fin_Thread_Info));
@@ -92,18 +105,17 @@
     assert(status == TM_ERROR_NONE);
     
     fin_thread_info->thread_ids = (hythread_t *)STD_MALLOC(sizeof(hythread_t) * fin_thread_info->thread_num);
-    fin_thread_info->thread_attached_num = 0;
     
     for(unsigned int i = 0; i < fin_thread_info->thread_num; i++){
         void **args = (void **)STD_MALLOC(sizeof(void *) * 2);
         args[0] = (void *)java_vm;
         args[1] = (void *)(UDATA)(i + 1);
         fin_thread_info->thread_ids[i] = NULL;
+		clear_fin_thread_attached();
         status = hythread_create(&fin_thread_info->thread_ids[i], 0, FINALIZER_THREAD_PRIORITY, 0, (hythread_entrypoint_t)finalizer_thread_func, args);
         assert(status == TM_ERROR_NONE);
-    }
-    
-    wait_fin_threads_attached();
+		wait_fin_thread_attached();
+    }    
 }
 
 void finalizer_shutdown(Boolean start_finalization_on_exit)
@@ -124,19 +136,10 @@
     activate_finalizer_threads(TRUE);
 }
 
-static void inc_fin_thread_num(void)
-{ atomic_inc32(&fin_thread_info->thread_attached_num); }
-
-static void dec_fin_thread_num(void)
-{ atomic_dec32(&fin_thread_info->thread_attached_num); }
-
-static void wait_fin_threads_attached(void)
-{ while(fin_thread_info->thread_attached_num < fin_thread_info->thread_num); }
-
 void wait_native_fin_threads_detached(void)
 {
     hymutex_lock(&fin_thread_info->end_mutex);
-    while(fin_thread_info->thread_attached_num){
+    while(fin_thread_info->thread_num){
         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)1000, 0);
         atomic_dec32(&fin_thread_info->end_waiting_num);
@@ -243,7 +246,8 @@
     IDATA status = AttachCurrentThreadAsDaemon(java_vm, (void**)&jni_env, jni_args);
     assert(status == JNI_OK);
     assign_classloader_to_native_threads(jni_env);
-    inc_fin_thread_num();
+	assert(!get_fin_thread_attached());
+    set_fin_thread_attached();
     
     /* Choice: use VM_thread or hythread to indicate the finalizer thread ?
      * Now we use hythread
@@ -313,6 +317,7 @@
     if(gc_clear_mutator_block_flag())
         hycond_notify_all(&fin_thread_info->mutator_block_cond);
 }
+