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/03/23 13:07:37 UTC

svn commit: r521690 - in /harmony/enhanced/drlvm/trunk/vm: gc_gen/src/common/ gc_gen/src/finalizer_weakref/ gc_gen/src/thread/ include/open/ thread/src/ vmcore/include/ vmcore/src/gc/ vmcore/src/init/ vmcore/src/jni/

Author: xli
Date: Fri Mar 23 05:07:36 2007
New Revision: 521690

URL: http://svn.apache.org/viewvc?view=rev&rev=521690
Log:
Harmony-3485 DRLVM GCv5 reenable finalizer load balance mechanism

Modified:
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp
    harmony/enhanced/drlvm/trunk/vm/include/open/gc.h
    harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
    harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h
    harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalize.h
    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/gc/dll_gc.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp
    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/init/vm_init.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp Fri Mar 23 05:07:36 2007
@@ -29,6 +29,7 @@
 #include "../finalizer_weakref/finalizer_weakref.h"
 
 static GC* p_global_gc = NULL;
+Boolean mutator_need_block;
 
 void gc_tls_init();
 
@@ -55,6 +56,8 @@
 #endif
   collector_initialize(gc);
   gc_init_heap_verification(gc);
+  
+  mutator_need_block = FALSE;
 
   return JNI_OK;
 }
@@ -203,6 +206,14 @@
     gc_gen_iterate_heap((GC_Gen *)p_global_gc);
 }
 
+void gc_set_mutator_block_flag()
+{  mutator_need_block = TRUE; }
 
+Boolean gc_clear_mutator_block_flag()
+{
+  Boolean old_flag = mutator_need_block;
+  mutator_need_block = FALSE;
+  return old_flag;
+}
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp Fri Mar 23 05:07:36 2007
@@ -27,7 +27,7 @@
 #include "../mark_sweep/lspace.h"
 #include "../gen/gen.h"
 
-Boolean IGNORE_FINREF = TRUE;
+Boolean IGNORE_FINREF = FALSE;
 
 
 static inline Boolean obj_is_dead_in_gen_minor_gc(Partial_Reveal_Object *p_obj)

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h Fri Mar 23 05:07:36 2007
@@ -21,7 +21,7 @@
 #ifndef _FINREF_H_
 #define _FINREF_H_
 
-#define BUILD_IN_REFERENT
+//#define BUILD_IN_REFERENT
 
 #include "finalizer_weakref_metadata.h"
 #include "../thread/collector.h"

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp Fri Mar 23 05:07:36 2007
@@ -51,6 +51,8 @@
 }
 #endif
 
+extern Boolean mutator_need_block;
+
 Managed_Object_Handle gc_alloc(unsigned size, Allocation_Handle ah, void *unused_gc_tls) 
 {
   Managed_Object_Handle p_obj = NULL;
@@ -60,6 +62,10 @@
   assert(ah);
 
   Allocator* allocator = (Allocator*)gc_get_tls();
+  Boolean type_has_fin = type_has_finalizer((Partial_Reveal_VTable*)uncompress_vt((VT)ah));
+  
+  if(type_has_fin && !IGNORE_FINREF && mutator_need_block)
+    vm_heavy_finalizer_block_mutator();
 
 #ifdef GC_OBJ_SIZE_STATISTIC
   gc_alloc_statistic_obj_distrubution(size);
@@ -75,7 +81,7 @@
     
   obj_set_vt((Partial_Reveal_Object*)p_obj, (VT)ah);
   
-  if(!IGNORE_FINREF && type_has_finalizer( (Partial_Reveal_VTable *) uncompress_vt((VT)ah) ))
+  if(type_has_fin && !IGNORE_FINREF)
     mutator_add_finalizer((Mutator*)allocator, (Partial_Reveal_Object*)p_obj);
     
   return (Managed_Object_Handle)p_obj;

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/gc.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/gc.h?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/gc.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/gc.h Fri Mar 23 05:07:36 2007
@@ -563,6 +563,8 @@
 extern Managed_Object_Handle (*gc_get_next_live_object)(void *iterator);
 extern void (*gc_iterate_heap)();
 extern void (*gc_finalize_on_exit)();
+extern void (*gc_set_mutator_block_flag)();
+extern Boolean (*gc_clear_mutator_block_flag)();
 
 
 
@@ -742,6 +744,15 @@
  */
 GCExport void gc_finalize_on_exit();
 
+/**
+ * Sets the mutator need block flag in case of heavy finalizable object load
+ */
+GCExport void gc_set_mutator_block_flag();
+
+/**
+ * Clears the mutator need block flag when heavy finalizable object load lightens
+ */
+GCExport Boolean gc_clear_mutator_block_flag();
 
 //@}
 /** @name Routines to support soft, weak, and phantom reference objects

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h Fri Mar 23 05:07:36 2007
@@ -203,6 +203,7 @@
 IDATA VMCALL hycond_create (hycond_t *cond);
 IDATA VMCALL hycond_wait (hycond_t *cond, hymutex_t *mutex);
 IDATA VMCALL hycond_wait_timed (hycond_t *cond, hymutex_t *mutex, I_64 millis, IDATA nanos);
+IDATA VMCALL hycond_wait_timed_raw(hycond_t * cond, hymutex_t * mutex, I_64 ms, IDATA nano);
 IDATA VMCALL hycond_wait_interruptable (hycond_t *cond, hymutex_t *mutex, I_64 millis, IDATA nanos);
 IDATA VMCALL hycond_notify (hycond_t *cond);
 IDATA VMCALL hycond_notify_all (hycond_t *cond);

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h Fri Mar 23 05:07:36 2007
@@ -182,6 +182,8 @@
 
 VMEXPORT void set_native_finalizer_thread_flag(Boolean flag);
 
+VMEXPORT void vm_heavy_finalizer_block_mutator(void);
+
 /**
  * GC should call this function when an phantom reference object
  * is to be enqueued, i.e. when the reference is not reachable anymore.

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def Fri Mar 23 05:07:36 2007
@@ -90,6 +90,7 @@
 hycond_create
 hycond_wait
 hycond_wait_timed
+hycond_wait_timed_raw
 hycond_wait_interruptable
 hycond_notify
 hycond_notify_all

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c Fri Mar 23 05:07:36 2007
@@ -99,6 +99,15 @@
 }
 
 /**
+ * Instructs the current thread to wait until signaled to wake up or timeout.
+ * Directly using OS interfaces.
+ * This function does not implement interruptability and thread state functionality.
+ */
+IDATA VMCALL hycond_wait_timed_raw(hycond_t *cond, hymutex_t *mutex, I_64 ms, IDATA nano) {
+    return os_cond_timedwait(cond, mutex, ms, nano);
+}
+
+/**
  * Instructs the current thread to wait until signaled to wake up or
  * the specified timeout is elapsed.
  *

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalize.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalize.h?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalize.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalize.h Fri Mar 23 05:07:36 2007
@@ -49,6 +49,7 @@
 void vm_enumerate_references_to_enqueue();
 int vm_get_references_quantity();
 
+void vm_activate_ref_enqueue_thread();
 void vm_enqueue_references();
 void vm_ref_enqueue_func(void);   // added for NATIVE REFERENCE ENQUEUE THREAD
 

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=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/finalizer_thread.h Fri Mar 23 05:07:36 2007
@@ -21,68 +21,70 @@
 #ifndef _FINALIZER_THREAD_H_
 #define _FINALIZER_THREAD_H_
 
+#include <assert.h>
+#include <apr_atomic.h>
 #include "jni_types.h"
+#include "port_sysinfo.h"
 #include "open/hythread_ext.h"
-#include <assert.h>
 #include "open/types.h"
-#include <apr_atomic.h>
+#include "open/gc.h"
 
-#ifndef _FINALIZER_WEAKREF_PLATFORM_
-#define _FINALIZER_WEAKREF_PLATFORM_
 
-#define VmEventHandle   hysem_t
+#define FINALIZER_THREAD_PRIORITY (HYTHREAD_PRIORITY_NORMAL + 2)
 
-inline int vm_wait_event(VmEventHandle event)
-{
-    IDATA stat = hysem_wait(event);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_set_event(VmEventHandle event, IDATA count)
-{
-    IDATA stat = hysem_set(event, count);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_post_event(VmEventHandle event)
-{
-    IDATA stat = hysem_set(event, 1);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_create_event(VmEventHandle* event, unsigned int initial_count, unsigned int max_count)
-{
-    return hysem_create(event, initial_count, max_count);
-}
-
-
-typedef volatile unsigned int SpinLock;
-enum Lock_State{
-  FREE_LOCK,
-  LOCKED
-};
-
-#define gc_try_lock(x) (!apr_atomic_cas32(&(x), LOCKED, FREE_LOCK))
-#define gc_lock(x) while( !gc_try_lock(x)){ while( x==LOCKED );}
-#define gc_unlock(x) do{ x = FREE_LOCK;}while(0)
-
-#endif
-
-#define FINALIZER_THREAD_PRIORITY (HYTHREAD_PRIORITY_USER_MAX - 3)
-
-struct finalizer_thread_info {
-    SpinLock lock;
-    int thread_num;
-    int working_thread_num;
-    Boolean shutdown;
-    Boolean on_exit;
-    VmEventHandle finalizer_pending_event;
-    VmEventHandle finalization_end_event;
-};
+#define MUTATOR_BLOCK_THRESHOLD_BITS 6
+#define MUTATOR_BLOCK_THRESHOLD ((1 << MUTATOR_BLOCK_THRESHOLD_BITS) - 3)
+#define MUTATOR_RESUME_THRESHOLD_BITS 8
+#define MUTATOR_RESUME_THRESHOLD ((1 << MUTATOR_RESUME_THRESHOLD_BITS) - 3)
+
+#define FIN_MAX_WAIT_TIME_BITS 7
+#define FIN_MAX_WAIT_TIME (1 << FIN_MAX_WAIT_TIME_BITS)
+
+
+typedef struct Fin_Thread_Info {
+    hysem_t pending_sem;                        // finalizer pending event
+    
+    hycond_t end_cond;                          // finalization end condition variable
+    hymutex_t end_mutex;                        // finalization end mutex
+    
+    hycond_t mutator_block_cond;                // mutator block condition variable for heavy finalizable obj load
+    hymutex_t mutator_block_mutex;              // mutator block mutex for heavy finalizable obj load
+    
+    hythread_t *thread_ids;
+    unsigned int thread_num;
+    
+    volatile Boolean shutdown;
+    volatile Boolean on_exit;
+    volatile unsigned int working_thread_num;
+    volatile unsigned int end_waiting_num;      // thread num waiting for finalization end
+}Fin_Thread_Info;
 
 
 extern Boolean get_finalizer_shutdown_flag();
 extern Boolean get_finalizer_on_exit_flag();
-extern void finalizer_threads_init(JavaVM *java_vm, JNIEnv *jni_env);
+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);
+
+
+extern void vm_heavy_finalizer_resume_mutator(void);
+
+extern unsigned int cpu_num_bits;
+
+inline void sched_heavy_finalizer(unsigned int finalizable_obj_num)
+{
+    unsigned int block_threshold = MUTATOR_BLOCK_THRESHOLD << cpu_num_bits;
+    if(finalizable_obj_num >= block_threshold && !(finalizable_obj_num % block_threshold))
+        gc_set_mutator_block_flag();
+}
+
+inline void sched_heavy_finalizer_in_finalization(unsigned int finalizable_obj_num, unsigned int finalized_obj_num)
+{
+    sched_heavy_finalizer(finalizable_obj_num);
+    unsigned int resume_threshold = MUTATOR_RESUME_THRESHOLD;// << cpu_num_bits;
+    if(finalized_obj_num >= resume_threshold && !(finalized_obj_num % resume_threshold))
+        vm_heavy_finalizer_resume_mutator();
+}
 
 #endif // _FINALIZER_THREAD_H_

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=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/ref_enqueue_thread.h Fri Mar 23 05:07:36 2007
@@ -21,60 +21,24 @@
 #ifndef _REF_ENQUEUE_THREAD_H_
 #define _REF_ENQUEUE_THREAD_H_
 
+#include <assert.h>
 #include "jni_types.h"
 #include "open/hythread_ext.h"
-#include <assert.h>
 #include "open/types.h"
-#include <apr_atomic.h>
 
-#ifndef _FINALIZER_WEAKREF_PLATFORM_
-#define _FINALIZER_WEAKREF_PLATFORM_
 
-#define VmEventHandle   hysem_t
+#define REF_ENQUEUE_THREAD_PRIORITY HYTHREAD_PRIORITY_USER_MAX
+#define REF_ENQUEUE_THREAD_NUM 1
 
-inline int vm_wait_event(VmEventHandle event)
-{
-    IDATA stat = hysem_wait(event);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_set_event(VmEventHandle event, IDATA count)
-{
-    IDATA stat = hysem_set(event, count);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_post_event(VmEventHandle event)
-{
-    IDATA stat = hysem_set(event, 1);
-    assert(stat == TM_ERROR_NONE); return stat;
-}
-inline int vm_create_event(VmEventHandle* event, unsigned int initial_count, unsigned int max_count)
-{
-    return hysem_create(event, initial_count, max_count);
-}
-
-
-typedef volatile unsigned int SpinLock;
-enum Lock_State{
-  FREE_LOCK,
-  LOCKED
-};
-
-#define gc_try_lock(x) (!apr_atomic_cas32(&(x), LOCKED, FREE_LOCK))
-#define gc_lock(x) while( !gc_try_lock(x)){ while( x==LOCKED );}
-#define gc_unlock(x) do{ x = FREE_LOCK;}while(0)
-
-#endif
-
-#define REF_ENQUEUE_THREAD_PRIORITY (HYTHREAD_PRIORITY_USER_MAX - 1)
-
-struct ref_enqueue_thread_info {
-    SpinLock lock;
-    VmEventHandle reference_pending_event;
+
+typedef struct Ref_Enqueue_Thread_Info {
+    hysem_t pending_sem;
     Boolean shutdown;
-};
+}Ref_Enqueue_Thread_Info;
+
 
 extern Boolean get_native_ref_enqueue_thread_flag();
-extern void ref_enqueue_thread_init(JavaVM *java_vm, JNIEnv *jni_env);
+extern void ref_enqueue_thread_init(JavaVM *java_vm);
 extern void ref_enqueue_shutdown(void);
 extern void activate_ref_enqueue_thread(void);
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/dll_gc.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/dll_gc.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/dll_gc.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/dll_gc.cpp Fri Mar 23 05:07:36 2007
@@ -41,6 +41,8 @@
 static Managed_Object_Handle default_gc_get_next_live_object(void*);
 static void default_gc_iterate_heap();
 static void default_gc_finalize_on_exit();
+static void default_gc_set_mutator_block_flag();
+static Boolean default_gc_clear_mutator_block_flag();
 static int64 default_gc_max_memory();
 static void default_gc_wrapup();
 static Boolean default_gc_requires_barriers();
@@ -126,6 +128,8 @@
 void (*gc_iterate_heap)() = 0;
 
 void (*gc_finalize_on_exit)() = 0;
+void (*gc_set_mutator_block_flag)() = 0;
+Boolean (*gc_clear_mutator_block_flag)() = 0;
 
 static apr_dso_handle_sym_t getFunction(apr_dso_handle_t *handle, const char *name, const char *dllName)
 {
@@ -263,6 +267,15 @@
     gc_finalize_on_exit = (void (*)())
         getFunctionOptional(handle, "gc_finalize_on_exit", dllName,
             (apr_dso_handle_sym_t)default_gc_finalize_on_exit);
+
+    gc_set_mutator_block_flag = (void (*)())
+        getFunctionOptional(handle, "gc_set_mutator_block_flag", dllName,
+            (apr_dso_handle_sym_t)default_gc_set_mutator_block_flag);
+
+    gc_clear_mutator_block_flag = (Boolean (*)())
+        getFunctionOptional(handle, "gc_clear_mutator_block_flag", dllName,
+            (apr_dso_handle_sym_t)default_gc_clear_mutator_block_flag);
+
     gc_get_hashcode0 = (int32 (*)(Managed_Object_Handle))
         getFunctionOptional(handle, "gc_get_hashcode", dllName, (apr_dso_handle_sym_t) default_gc_get_hashcode);
 
@@ -493,6 +506,18 @@
 static void default_gc_finalize_on_exit()
 {
     WARN_ONCE(12, "The GC did not provide finalization on exit");
+}
+
+static void default_gc_set_mutator_block_flag()
+{
+    WARN_ONCE(43, "The GC did not provide set mutator block flag");
+}
+
+
+static Boolean default_gc_clear_mutator_block_flag()
+{
+    WARN_ONCE(44, "The GC did not provide clear mutator block flag");
+    return FALSE;
 }
 
 static int64 default_gc_max_memory()

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp Fri Mar 23 05:07:36 2007
@@ -194,6 +194,7 @@
     // Several Reference Queues may need to be notified because the GC added References to them. Do that now.
     //LOG2("ref", "Enqueueing references");
     //vm_enqueue_references();
+    vm_activate_ref_enqueue_thread();
     
     // For now we run the finalizers immediately in the context of the thread which requested GC.
     // Eventually we may have a different scheme, e.g., a dedicated finalize thread.
@@ -234,4 +235,5 @@
 //////////////////////////////////////////////////////////////////////////////
 ///////////////////////  LINUX/ WINDOWS specific /////////////////////////////
 //////////////////////////////////////////////////////////////////////////////
+
 

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=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalize.cpp Fri Mar 23 05:07:36 2007
@@ -476,6 +476,11 @@
             return i;
         }
         
+        if(get_native_finalizer_thread_flag()){
+            int finalizable_obj_num = getLength();
+            sched_heavy_finalizer_in_finalization(finalizable_obj_num, i);
+        }
+        
         tmn_suspend_disable();
         assert(handle->object->vt()->clss);
         Class *clss = handle->object->vt()->clss;
@@ -484,8 +489,7 @@
         /* BEGIN: modified for NATIVE FINALIZER THREAD */
         if(native_finalizer_thread_flag) {
             native_finalizer_on_exit = get_finalizer_on_exit_flag();
-
-            if (native_finalizer_on_exit  && is_class_ignored(clss)) {
+            if(native_finalizer_on_exit  && is_class_ignored(clss)) {
                 tmn_suspend_enable();
                 continue;
             }
@@ -577,6 +581,10 @@
 void vm_finalize_object(Managed_Object_Handle p_obj)
 {
     objects_to_finalize.add_object((ManagedObject *)p_obj);
+    if(get_native_finalizer_thread_flag()){
+        int finalizable_obj_num = objects_to_finalize.getLength();
+        sched_heavy_finalizer(finalizable_obj_num);
+    }
 } //vm_finalize_object
 
 void vm_run_pending_finalizers()
@@ -639,6 +647,12 @@
     TRACE2("ref", obj << " is being added to enqueue list");
     references_to_enqueue.add_object((ManagedObject *)obj);
 } // vm_enqueue_reference
+
+void vm_activate_ref_enqueue_thread()
+{
+    if(get_native_ref_enqueue_thread_flag())
+        activate_ref_enqueue_thread();
+}
 
 void vm_enqueue_references()
 {

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=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Fri Mar 23 05:07:36 2007
@@ -20,60 +20,81 @@
 
 #include "finalizer_thread.h"
 #include "ref_enqueue_thread.h"
-#include "open/gc.h"
-#include "port_sysinfo.h"
 #include "finalize.h"
 #include "vm_threads.h"
-#include "../../../thread/src/thread_private.h"
+#include "init.h"
+#include "open/jthread.h"
 
-static Boolean native_finalizer_thread_flag = FALSE;
-static struct finalizer_thread_info *finalizer_thread_info = NULL;
+static Boolean native_fin_thread_flag = FALSE;
+static Fin_Thread_Info *fin_thread_info = NULL;
+unsigned int cpu_num_bits;
 
+static uint32 atomic_inc32(volatile apr_uint32_t *mem)
+{  return (uint32)apr_atomic_inc32(mem); }
+
+static uint32 atomic_dec32(volatile apr_uint32_t *mem)
+{  return (uint32)apr_atomic_dec32(mem); }
 
 Boolean get_native_finalizer_thread_flag()
-{
-  return native_finalizer_thread_flag;
-}
+{  return native_fin_thread_flag; }
 
 void set_native_finalizer_thread_flag(Boolean flag)
-{
-  native_finalizer_thread_flag = flag;
-}
+{  native_fin_thread_flag = flag; }
 
 Boolean get_finalizer_shutdown_flag()
-{
-  return finalizer_thread_info->shutdown;
-}
+{  return fin_thread_info->shutdown; }
 
 Boolean get_finalizer_on_exit_flag()
+{  return fin_thread_info->on_exit; }
+
+static unsigned int coarse_log(unsigned int num)
 {
-  return finalizer_thread_info->on_exit;
+    unsigned int i = sizeof(unsigned int) << 3;
+    unsigned int comp = 1 << (i-1);
+    while(i--){
+        if(num & comp)
+            return i;
+        num = num << 1;
+    }
+    return 0;
 }
 
 static int finalizer_thread_func(void **args);
 
-void finalizer_threads_init(JavaVM *java_vm, JNIEnv *jni_env)
+void finalizer_threads_init(JavaVM *java_vm)
 {
-    if(!native_finalizer_thread_flag)
+    if(!native_fin_thread_flag)
         return;
     
-    finalizer_thread_info = (struct finalizer_thread_info *)STD_MALLOC(sizeof(struct finalizer_thread_info));
-    finalizer_thread_info->lock = FREE_LOCK;
-    finalizer_thread_info->thread_num = port_CPUs_number();
-    finalizer_thread_info->working_thread_num = 0;
-    finalizer_thread_info->shutdown = FALSE;
-    finalizer_thread_info->on_exit = FALSE;
-    
-    int status = vm_create_event(&finalizer_thread_info->finalizer_pending_event, 0, finalizer_thread_info->thread_num);
-    assert(status == TM_ERROR_NONE);
-    status = vm_create_event(&finalizer_thread_info->finalization_end_event, 0, 1);
-    assert(status == TM_ERROR_NONE);
-    
-    void **args = (void **)STD_MALLOC(sizeof(void *)*2);
-    args[0] = (void *)java_vm;
-    args[1] = (void *)jni_env;
-    for(int i = 0; i < finalizer_thread_info->thread_num; i++){
-        status = (unsigned int)hythread_create(NULL, 0, 0, 0, (hythread_entrypoint_t)finalizer_thread_func, args);
+    fin_thread_info = (Fin_Thread_Info *)STD_MALLOC(sizeof(Fin_Thread_Info));
+    fin_thread_info->thread_num = port_CPUs_number();
+    cpu_num_bits = coarse_log(fin_thread_info->thread_num);
+    fin_thread_info->working_thread_num = 0;
+    fin_thread_info->end_waiting_num = 0;
+    fin_thread_info->shutdown = FALSE;
+    fin_thread_info->on_exit = FALSE;
+    
+    IDATA status = hysem_create(&fin_thread_info->pending_sem, 0, fin_thread_info->thread_num);
+    assert(status == TM_ERROR_NONE);
+    
+    status = hycond_create(&fin_thread_info->end_cond);
+    assert(status == TM_ERROR_NONE);
+    status = hymutex_create(&fin_thread_info->end_mutex, TM_MUTEX_DEFAULT);
+    assert(status == TM_ERROR_NONE);
+    
+    status = hycond_create(&fin_thread_info->mutator_block_cond);
+    assert(status == TM_ERROR_NONE);
+    status = hymutex_create(&fin_thread_info->mutator_block_mutex, TM_MUTEX_DEFAULT);
+    assert(status == TM_ERROR_NONE);
+    
+    fin_thread_info->thread_ids = (hythread_t *)STD_MALLOC(sizeof(hythread_t) * fin_thread_info->thread_num);
+    
+    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 *)(i + 1);
+        fin_thread_info->thread_ids[i] = NULL;
+        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);
     }
 }
@@ -82,99 +103,145 @@
 {
     if(start_finalization_on_exit){
         tmn_suspend_disable();
-        gc_force_gc();      
+        gc_force_gc();
         tmn_suspend_enable();
         activate_finalizer_threads(TRUE);
         tmn_suspend_disable();
         gc_finalize_on_exit();
         tmn_suspend_enable();
-        gc_lock(finalizer_thread_info->lock);
-        finalizer_thread_info->on_exit = TRUE;
-        gc_unlock(finalizer_thread_info->lock);
+        fin_thread_info->on_exit = TRUE;
         activate_finalizer_threads(TRUE);
     }
-    gc_lock(finalizer_thread_info->lock);
-    finalizer_thread_info->shutdown = TRUE;
-    gc_unlock(finalizer_thread_info->lock);
+    fin_thread_info->shutdown = TRUE;
     ref_enqueue_shutdown();
-    activate_finalizer_threads(FALSE);
+    activate_finalizer_threads(TRUE);
+}
+
+/* Restrict waiting time; Unit: msec */
+static unsigned int restrict_wait_time(unsigned int wait_time, unsigned int max_time)
+{
+    if(!wait_time) return 1;
+    if(wait_time > max_time) return max_time;
+    return wait_time;
 }
 
 static void wait_finalization_end(void)
 {
-    vm_wait_event(finalizer_thread_info->finalization_end_event);
+    hymutex_lock(&fin_thread_info->end_mutex);
+    while(unsigned int fin_obj_num = vm_get_finalizable_objects_quantity()){
+        unsigned int wait_time = restrict_wait_time(fin_obj_num + 100, 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;
+    }
+    hymutex_unlock(&fin_thread_info->end_mutex);
 }
 
 void activate_finalizer_threads(Boolean wait)
 {
-    gc_lock(finalizer_thread_info->lock);
-    vm_set_event(finalizer_thread_info->finalizer_pending_event,
-                    finalizer_thread_info->thread_num - finalizer_thread_info->working_thread_num);
-    gc_unlock(finalizer_thread_info->lock);
+    IDATA stat = hysem_set(fin_thread_info->pending_sem, fin_thread_info->thread_num);
+    assert(stat == TM_ERROR_NONE);
     
     if(wait)
         wait_finalization_end();
 }
 
-void vmmemory_manager_runfinalization(void)
+static void notify_finalization_end(void)
 {
-    activate_finalizer_threads(TRUE);
+    if(vm_get_finalizable_objects_quantity()==0 && fin_thread_info->working_thread_num==0)
+        hycond_notify_all(&fin_thread_info->end_cond);
 }
 
-
-static int do_finalization_func(void)
+void vmmemory_manager_runfinalization(void)
 {
-    return vm_do_finalization(0);
+    activate_finalizer_threads(TRUE);
 }
 
 static void wait_pending_finalizer(void)
 {
-    vm_wait_event(finalizer_thread_info->finalizer_pending_event);
-}
-
-static void notify_finalization_end(void)
-{
-    vm_post_event(finalizer_thread_info->finalization_end_event);
-}
-
-static void finalizer_notify_work_done(void)
-{
-    gc_lock(finalizer_thread_info->lock);
-    --finalizer_thread_info->working_thread_num;
-    if(finalizer_thread_info->working_thread_num == 0)
-        notify_finalization_end();
-    gc_unlock(finalizer_thread_info->lock);
+    IDATA stat = hysem_wait(fin_thread_info->pending_sem);
+    assert(stat == TM_ERROR_NONE);
 }
 
 static int finalizer_thread_func(void **args)
 {
     JavaVM *java_vm = (JavaVM *)args[0];
-    JNIEnv *jni_env = (JNIEnv *)args[1];
+    JNIEnv *jni_env;
+    jthread java_thread;
+    char *name = "finalizer";
+    jboolean daemon = JNI_TRUE;
+    int thread_id = (int)args[1];
+    
+    IDATA status = vm_attach_internal(&jni_env, &java_thread, java_vm, NULL, name, daemon);
+    assert(status == JNI_OK);
+    status = jthread_attach(jni_env, java_thread, daemon);
+    assert(status == TM_ERROR_NONE);
     
-    IDATA status = vm_attach(java_vm, &jni_env, NULL);
-    if(status != TM_ERROR_NONE)
-        return status;
+    /* Choice: use VM_thread or hythread to indicate the finalizer thread ?
+     * Now we use hythread
+     * p_TLS_vmthread->finalize_thread_flags = thread_id;
+     */
     
     while(true){
         /* Waiting for pending finalizers */
         wait_pending_finalizer();
         
-        gc_lock(finalizer_thread_info->lock);
-        ++finalizer_thread_info->working_thread_num;
-        gc_unlock(finalizer_thread_info->lock);
-        
         /* do the real finalization work */
-        do_finalization_func();
+        atomic_inc32(&fin_thread_info->working_thread_num);
+        vm_do_finalization(0);
+        atomic_dec32(&fin_thread_info->working_thread_num);
         
-        finalizer_notify_work_done();
+        vm_heavy_finalizer_resume_mutator();
         
-        gc_lock(finalizer_thread_info->lock);
-        if(finalizer_thread_info->shutdown){
-            gc_unlock(finalizer_thread_info->lock);
+        if(fin_thread_info->end_waiting_num)
+            notify_finalization_end();
+        
+        if(fin_thread_info->shutdown)
             break;
-        }
-        gc_unlock(finalizer_thread_info->lock);
     }
+    
+    vm_heavy_finalizer_resume_mutator();
+    status = jthread_detach(java_thread);
+    return status;
+}
 
-    return TM_ERROR_NONE;
+
+/* Heavy finalizable object load handling mechanism */
+
+/* Choice: use VM_thread or hythread to indicate the finalizer thread ?
+ * Now we use hythread
+ * p_TLS_vmthread->finalize_thread_flags = thread_id;
+ */
+static Boolean self_is_finalizer_thread(void)
+{
+    hythread_t self = hythread_self();
+    
+    for(unsigned int i=0; i<fin_thread_info->thread_num; ++i)
+        if(self == fin_thread_info->thread_ids[i])
+            return TRUE;
+    
+    return FALSE;
+}
+
+void vm_heavy_finalizer_block_mutator(void)
+{
+    /* Maybe self test is not needed. This needs further test. */
+    if(self_is_finalizer_thread())
+        return;
+    
+    hymutex_lock(&fin_thread_info->mutator_block_mutex);
+    unsigned int fin_obj_num = vm_get_finalizable_objects_quantity();
+    fin_obj_num = fin_obj_num >> (MUTATOR_BLOCK_THRESHOLD_BITS + cpu_num_bits);
+    unsigned int wait_time = restrict_wait_time(fin_obj_num, FIN_MAX_WAIT_TIME);
+    if(fin_obj_num)
+        IDATA status = hycond_wait_timed_raw(&fin_thread_info->mutator_block_cond, &fin_thread_info->mutator_block_mutex, wait_time, 0);
+    hymutex_unlock(&fin_thread_info->mutator_block_mutex);
 }
+
+void vm_heavy_finalizer_resume_mutator(void)
+{
+    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=521690&r1=521689&r2=521690
==============================================================================
--- 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 Fri Mar 23 05:07:36 2007
@@ -21,92 +21,82 @@
 #include "ref_enqueue_thread.h"
 #include "finalize.h"
 #include "vm_threads.h"
-#include "../../../thread/src/thread_private.h"
+#include "init.h"
+#include "open/jthread.h"
 
-static Boolean native_ref_enqueue_thread_flag = FALSE;
-static struct ref_enqueue_thread_info *ref_enqueue_thread_info = NULL;
+
+static Boolean native_ref_thread_flag = FALSE;
+static Ref_Enqueue_Thread_Info *ref_thread_info = NULL;
 
 
 Boolean get_native_ref_enqueue_thread_flag()
-{
-  return native_ref_enqueue_thread_flag;
-}
+{  return native_ref_thread_flag; }
 
 void set_native_ref_enqueue_thread_flag(Boolean flag)
-{
-  native_ref_enqueue_thread_flag = flag;
-}
+{  native_ref_thread_flag = flag; }
+
 
 static int ref_enqueue_thread_func(void **args);
 
-void ref_enqueue_thread_init(JavaVM *java_vm, JNIEnv *jni_env)
+void ref_enqueue_thread_init(JavaVM *java_vm)
 {
-    if(!get_native_ref_enqueue_thread_flag())
+    if(!native_ref_thread_flag)
         return;
     
-    ref_enqueue_thread_info = (struct ref_enqueue_thread_info *)STD_MALLOC(sizeof(struct ref_enqueue_thread_info));
-    ref_enqueue_thread_info->lock = FREE_LOCK;
-    ref_enqueue_thread_info->shutdown = FALSE;
+    ref_thread_info = (Ref_Enqueue_Thread_Info *)STD_MALLOC(sizeof(Ref_Enqueue_Thread_Info));
+    ref_thread_info->shutdown = FALSE;
     
-    int status = vm_create_event(&ref_enqueue_thread_info->reference_pending_event, 0, 1);
+    IDATA status = hysem_create(&ref_thread_info->pending_sem, 0, REF_ENQUEUE_THREAD_NUM);
     assert(status == TM_ERROR_NONE);
     
-    void **args = (void **)STD_MALLOC(sizeof(void *)*2);
+    void **args = (void **)STD_MALLOC(sizeof(void *));
     args[0] = (void *)java_vm;
-    args[1] = (void *)jni_env;
-    status = (unsigned int)hythread_create(NULL, 0, REF_ENQUEUE_THREAD_PRIORITY, 0, (hythread_entrypoint_t)ref_enqueue_thread_func, args);
+    status = hythread_create(NULL, 0, REF_ENQUEUE_THREAD_PRIORITY, 0, (hythread_entrypoint_t)ref_enqueue_thread_func, args);
     assert(status == TM_ERROR_NONE);
 }
 
 void ref_enqueue_shutdown(void)
 {
-    gc_lock(ref_enqueue_thread_info->lock);
-    ref_enqueue_thread_info->shutdown = TRUE;
-    gc_unlock(ref_enqueue_thread_info->lock);
+    ref_thread_info->shutdown = TRUE;
     activate_ref_enqueue_thread();
 }
 
 void activate_ref_enqueue_thread(void)
 {
-    vm_post_event(ref_enqueue_thread_info->reference_pending_event);
-}
-
-
-static int ref_enqueue_func(void)
-{
-    vm_ref_enqueue_func();
-    return 0;
+    IDATA stat = hysem_set(ref_thread_info->pending_sem, REF_ENQUEUE_THREAD_NUM);
+    assert(stat == TM_ERROR_NONE);
 }
 
 static void wait_pending_reference(void)
 {
-    vm_wait_event(ref_enqueue_thread_info->reference_pending_event);
+    IDATA stat = hysem_wait(ref_thread_info->pending_sem);
+    assert(stat == TM_ERROR_NONE);
 }
 
-
 static int ref_enqueue_thread_func(void **args)
 {
     JavaVM *java_vm = (JavaVM *)args[0];
-    JNIEnv *jni_env = (JNIEnv *)args[1];
+    JNIEnv *jni_env;
+    jthread java_thread;
+    char *name = "ref handler";
+    jboolean daemon = JNI_TRUE;
     
-    IDATA status = vm_attach(java_vm, &jni_env, NULL);
-    if(status != TM_ERROR_NONE)
-        return status;
+    IDATA status = vm_attach_internal(&jni_env, &java_thread, java_vm, NULL, name, daemon);
+    assert(status == JNI_OK);
+    status = jthread_attach(jni_env, java_thread, daemon);
+    assert(status == TM_ERROR_NONE);
     
     while(true){
         /* Waiting for pending weak references */
         wait_pending_reference();
         
         /* do the real reference enqueue work */
-        ref_enqueue_func();
-                
-        gc_lock(ref_enqueue_thread_info->lock);
-        if(ref_enqueue_thread_info->shutdown){
-            gc_unlock(ref_enqueue_thread_info->lock);
+        vm_ref_enqueue_func();
+        
+        if(ref_thread_info->shutdown)
             break;
-        }
-        gc_unlock(ref_enqueue_thread_info->lock);
     }
-
-    return TM_ERROR_NONE;
+    
+    status = jthread_detach(java_thread);
+    return status;
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp Fri Mar 23 05:07:36 2007
@@ -47,8 +47,6 @@
 #include "slot.h"
 #include "classpath_const.h"
 #include "finalize.h"
-#include "finalizer_thread.h"   /* added for NATIVE FINALIZER THREAD */
-#include "ref_enqueue_thread.h" /* added for NATIVE REFERENCE ENQUEUE THREAD */
 
 #ifdef PLATFORM_NT
 // 20040427 Used to turn on heap checking on every allocation
@@ -702,9 +700,6 @@
 
     status = vm_attach(java_vm, &jni_env, NULL);
     if (status != JNI_OK) return status;
-    
-    finalizer_threads_init(java_vm, jni_env);   /* added for NATIVE FINALIZER THREAD */
-    ref_enqueue_thread_init(java_vm, jni_env);  /* added for NATIVE REFERENCE ENQUEUE THREAD */
     
     // "Tool Interface" initialization
     status = vm_env->TI->Init(java_vm);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp?view=diff&rev=521690&r1=521689&r2=521690
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp Fri Mar 23 05:07:36 2007
@@ -51,6 +51,8 @@
 #include "jit_runtime_support.h"
 #include "jvmti_direct.h"
 #include "stack_trace.h"
+#include "finalizer_thread.h"
+#include "ref_enqueue_thread.h"
 
 #ifdef _IPF_
 #include "stub_code_utils.h"
@@ -510,7 +512,10 @@
     }
     assert(jthread_self() != NULL);
     *p_jni_env = jni_env;
-
+    
+    finalizer_threads_init(java_vm);   /* added for NATIVE FINALIZER THREAD */
+    ref_enqueue_thread_init(java_vm);  /* added for NATIVE REFERENCE ENQUEUE THREAD */
+    
     // Now JVMTIThread keeps global reference. Discared temporary global reference.
     jni_env->DeleteGlobalRef(java_thread);