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/18 12:12:45 UTC

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

Author: xli
Date: Wed Apr 18 03:12:44 2007
New Revision: 529950

URL: http://svn.apache.org/viewvc?view=rev&rev=529950
Log:
HARMONY-3671 : fix to force contextClassloader assignment to native thread that has java.lang.Thread object associated.

Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_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=529950&r1=529949&r2=529950
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Wed Apr 18 03:12:44 2007
@@ -25,6 +25,8 @@
 #include "init.h"
 #include "open/jthread.h"
 #include "jni_direct.h"
+#include "jni_utils.h"
+#include "slot.h"
 
 static Boolean native_fin_thread_flag = FALSE;
 static Fin_Thread_Info *fin_thread_info = NULL;
@@ -154,12 +156,14 @@
 static void wait_finalization_end(void)
 {
     hymutex_lock(&fin_thread_info->end_mutex);
-    while(unsigned int fin_obj_num = vm_get_finalizable_objects_quantity()){
+    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);
         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();
     }
     hymutex_unlock(&fin_thread_info->end_mutex);
 }
@@ -185,6 +189,36 @@
     assert(stat == TM_ERROR_NONE);
 }
 
+void assign_classloader_to_native_threads(JNIEnv *jni_env)
+{
+    jthread self_jthread = jthread_self();
+    ManagedObject *self_obj = (*self_jthread).object;
+    char *thread_jclass_name = "java/lang/Thread";
+    jclass thread_jclass = FindClass(jni_env, thread_jclass_name);
+    Class *thread_class = jclass_to_struct_Class(thread_jclass);
+    Field *loader_field = LookupField(thread_class, "contextClassLoader");
+    unsigned int offset = loader_field->get_offset();
+    
+    char *loader_jclass_name = "java/lang/ClassLoader";
+    jclass loader_jclass = FindClass(jni_env, loader_jclass_name);
+    Class *loader_class = jclass_to_struct_Class(loader_jclass);
+    
+    tmn_suspend_disable();
+    
+    Method *get_loader_method = LookupMethod(loader_class, "getSystemClassLoader", "()Ljava/lang/ClassLoader;");
+    assert(get_loader_method);
+    jvalue result;
+    vm_execute_java_method_array((jmethodID)get_loader_method, &result, NULL);
+    ManagedObject *sys_class_loader = (*(result.l)).object;
+    
+    uint32 *the_field = (uint32*)((POINTER_SIZE_INT)self_obj + offset);
+    void *heap_null = Slot::managed_null();
+    assert(sys_class_loader > heap_null);
+    *the_field = (uint32)((POINTER_SIZE_INT)sys_class_loader - (POINTER_SIZE_INT)heap_null);
+    
+    tmn_suspend_enable();
+}
+
 static IDATA finalizer_thread_func(void **args)
 {
     JavaVM *java_vm = (JavaVM *)args[0];
@@ -203,6 +237,7 @@
     jni_args->group = NULL;
     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();
     
     /* Choice: use VM_thread or hythread to indicate the finalizer thread ?
@@ -273,6 +308,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=529950&r1=529949&r2=529950
==============================================================================
--- 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 Wed Apr 18 03:12:44 2007
@@ -125,6 +125,8 @@
     assert(stat == TM_ERROR_NONE);
 }
 
+extern void assign_classloader_to_native_threads(JNIEnv *jni_env);
+
 static IDATA ref_enqueue_thread_func(void **args)
 {
     JavaVM *java_vm = (JavaVM *)args[0];
@@ -143,6 +145,7 @@
     jni_args->group = NULL;
     IDATA status = AttachCurrentThreadAsDaemon(java_vm, (void**)&jni_env, jni_args);
     assert(status == JNI_OK);
+    assign_classloader_to_native_threads(jni_env);
     inc_ref_thread_num();
     
     while(true){