You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by wj...@apache.org on 2007/07/16 21:32:52 UTC

svn commit: r556704 [2/5] - in /harmony/enhanced/drlvm/trunk: build/make/ build/make/components/vm/ build/make/targets/ vm/include/ vm/include/open/ vm/interpreter/src/ vm/port/src/lil/em64t/pim/ vm/port/src/lil/ia32/pim/ vm/port/src/lil/ipf/pim/ vm/te...

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c Mon Jul 16 12:32:35 2007
@@ -231,7 +231,7 @@
     // suspend_disable_count must be 0 on potentially
     // blocking operation to prevent suspension deadlocks,
     // meaning that the thread is safe for suspension
-    saved_count = reset_suspend_disable();
+    saved_count = hythread_reset_suspend_disable();
     r = hymutex_lock(&TM_LIBRARY->TM_LOCK);
     if (r) return r;
 
@@ -247,7 +247,7 @@
         if (r) return r;
     }
 
-    // do not use set_suspend_disable() as we do not
+    // do not use hythread_set_suspend_disable() as we do not
     // want safe points happening under global lock
     self->disable_count = saved_count;
     return 0;
@@ -423,74 +423,4 @@
     //hythread_monitor_exit(*p_global_monitor);
     return data+index;
 }
-
-
-/*
- * Resizable array implementation
- */
-
-IDATA array_create(array_t *array) {
-    array_t ptr;
-    ptr = (array_t)malloc(sizeof(ResizableArrayType));
-    if (!ptr) return -1;
-    ptr->capacity = 1024;
-    ptr->size     =0;
-    ptr->next_index = 0; 
-    ptr->entries = (array_entry_t)malloc(sizeof(ResizableArrayEntry)*ptr->capacity);
-    if (!ptr->entries) return -1;
-
-    *array = ptr;
-    return 0;
-}
-
-IDATA array_destroy(array_t array) {
-    if (!array) return -1;
-        free(array->entries);
-    free(array);
-
-    return 0;
-}
-
-UDATA array_add(array_t array, void *value) {
-    UDATA index;
-    if (!array) return 0;   
-    if (array->next_index) {
-        index = array->next_index;
-    } else {
-        index = array->size + 1;
-        if (index >= array->capacity) {
-            array->entries = realloc(array->entries, sizeof(void*)*array->capacity*2);
-            if (!array->entries) return 0;
-            array->capacity*=2;
-        }
-
-        array->entries[index].next_free=0;
-    }
-    
-    array->next_index = array->entries[index].next_free;
-    array->entries[index].entry = value;
-    array->size++;
-
-    return index;
-}
-
-void *array_delete(array_t array, UDATA index) {
-    void *return_value;
-    if (!array || index > array->size || index==0) return NULL;
-    return_value =  array->entries[index].entry;
-    
-    array->entries[index].entry = NULL;
-    array->entries[index].next_free = array->next_index;
-    array->next_index = index;
-
-    return return_value;
-}
-
-void *array_get(array_t array, UDATA index) {
-    if (!array || index > array->size || index==0) return NULL;
-    return array->entries[index].entry;
-}
-
-
-
 

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c Mon Jul 16 12:32:35 2007
@@ -33,6 +33,7 @@
 #   define hy_inline
 #endif //PLATFORM_POSIX
 
+#include <apr_atomic.h>
 #include <open/hythread_ext.h>
 #include "thread_private.h"
 
@@ -115,7 +116,7 @@
 
     new_thread->library = hythread_self()->library;
     new_thread->priority = priority ? priority : HYTHREAD_PRIORITY_NORMAL;
-    new_thread->stacksize = stacksize ? stacksize : HY_DEFAULT_STACKSIZE;
+    new_thread->stacksize = stacksize ? stacksize : TM_DEFAULT_STACKSIZE;
     //new_thread->suspend_request = suspend ? 1 : 0;
     
     start_proc_data =
@@ -483,28 +484,6 @@
 }
 
 /**
- * Returns thread private data.
- * 
- * @param[in] t thread those private data to get
- * @return pointer to thread private data
- */
-void* VMCALL hythread_get_private_data(hythread_t t) {
-    assert(t);
-    return t->private_data;
-}
-/**
- * Sets the thread private data. 
- *
- * @param t thread
- * @param data pointer to private data
- */
-IDATA VMCALL hythread_set_private_data(hythread_t t, void* data) {
-    assert(t);
-    t->private_data = data;
-    return TM_ERROR_NONE;
-}
-
-/**
  * Get thread group. 
  *
  * @param[out] group hythread_group_t* pointer to group
@@ -562,6 +541,7 @@
  *
  */
 IDATA VMCALL hythread_struct_init(hythread_t *ret_thread) {
+    assert(ret_thread);
     if (*ret_thread) {
         reset_thread(*ret_thread);
         return TM_ERROR_NONE;
@@ -642,9 +622,6 @@
     ptr->os_handle  = (osthread_t)NULL;
     ptr->priority   = HYTHREAD_PRIORITY_NORMAL;
     ptr->stacksize  = os_get_foreign_thread_stack_size();
-    ptr->name       = strdup("NONAME");
-    // not implemented
-    //ptr->big_thread_local_storage = (void **)calloc(1, sizeof(void*)*tm_tls_capacity);
     
     // Suspension
     ptr->request = 0;
@@ -664,19 +641,16 @@
 }
 
 static void reset_thread(hythread_t thread) {
-    int r;
-    IDATA status;
+    IDATA UNREF status;
     if (thread->os_handle) {
-        r = os_thread_join(thread->os_handle);
-        assert(!r);
+        int UNREF res = os_thread_join(thread->os_handle);
+        assert(!res);
     }
 
     hymutex_lock(&thread->mutex);
 
     thread->os_handle  = (osthread_t)NULL;
     thread->priority   = HYTHREAD_PRIORITY_NORMAL;
-    // not implemented
-    //ptr->big_thread_local_storage = (void **)calloc(1, sizeof(void*)*tm_tls_capacity);
 
     // Suspension
     thread->request = 0;
@@ -716,8 +690,7 @@
 
     status = register_to_group(thread, group);
     if (status != TM_ERROR_NONE) {
-        thread->exit_value = status;
-        return thread->exit_value;
+        return status;
     }
 
     // Also, should it be executed under TM global lock?
@@ -733,7 +706,6 @@
     assert(status == TM_ERROR_NONE);
     assert(hythread_is_suspend_enabled()); 
     thread->state = TM_THREAD_STATE_TERMINATED | (TM_THREAD_STATE_INTERRUPTED  & thread->state);
-    thread->exit_value = 0;
 
     hythread_detach(thread);
     // Send join event to those threads who called join on this thread.
@@ -775,3 +747,139 @@
 UDATA hythread_get_thread_stacksize(hythread_t thread) {
     return thread->stacksize;
 }
+
+IDATA VMCALL hythread_thread_lock(hythread_t thread) {
+    assert(thread);
+    return hymutex_lock(&thread->mutex);
+} // hythread_thread_lock
+
+IDATA VMCALL hythread_thread_unlock(hythread_t thread) {
+    assert(thread);
+    return hymutex_unlock(&thread->mutex);
+} // hythread_thread_unlock
+
+IDATA VMCALL hythread_get_state(hythread_t thread) {
+    IDATA state;
+    assert(thread);
+    hymutex_lock(&thread->mutex);
+    state = thread->state;
+    hymutex_unlock(&thread->mutex);
+    return state;
+} // hythread_get_state
+
+IDATA VMCALL hythread_set_state(hythread_t thread, IDATA state) {
+    assert(thread);
+    hymutex_lock(&thread->mutex);
+    thread->state = state;
+    hymutex_unlock(&thread->mutex);
+    return TM_ERROR_NONE;
+} // hythread_set_state
+
+IDATA VMCALL hythread_get_thread_id_offset() {
+    return (uint32)&((HyThread *)0)->thread_id;
+} // hythread_get_thread_id_offset
+
+IDATA VMCALL hythread_set_thread_stop_callback(hythread_t thread,
+    tm_thread_event_callback_proc stop_callback)
+{
+    IDATA status = hythread_set_safepoint_callback(thread, stop_callback);
+
+    while (thread->suspend_count > 0) {
+        apr_atomic_dec32((volatile apr_uint32_t *)
+            &thread->suspend_count);
+        apr_atomic_dec32((volatile apr_uint32_t *)
+            &thread->request);
+    }
+
+    // if there is no competition, it would be 1, but if someone else is
+    // suspending the same thread simultaneously, it could be greater than 1
+    // if safepoint callback isn't set it could be equal to 0.
+    //
+    // The following assertion may be false because at each time
+    // one of the conditions is true, and the other is false, but
+    // when checking the whole condition it may be failse in the result.
+    // assert(thread->request > 0 || thread->safepoint_callback == NULL);
+
+    // notify the thread that it may wake up now,
+    // so that it would eventually reach exception safepoint
+    // and execute callback
+    hysem_post(thread->resume_event);
+    return status;
+} // hythread_set_thread_stop_callback
+
+IDATA VMCALL hythread_wait_for_nondaemon_threads(hythread_t thread, IDATA threads_to_keep)
+{
+    IDATA status;
+    hythread_library_t lib;
+
+    assert(thread);
+    lib = thread->library;
+
+    status = hymutex_lock(&lib->TM_LOCK);
+    if (status != TM_ERROR_NONE) {
+        return status;
+    }
+
+    while (lib->nondaemon_thread_count - threads_to_keep > 0)
+    {
+        // check interruption and other problems
+        status = hycond_wait(&lib->nondaemon_thread_cond, &lib->TM_LOCK);
+
+        TRACE(("TM wait for nondaemons notified, count: %d",
+               lib->nondaemon_thread_count));
+
+        if (status != TM_ERROR_NONE) {
+            hymutex_unlock(&lib->TM_LOCK);
+            return status;
+        }
+    }
+
+    status = hymutex_unlock(&lib->TM_LOCK);
+    return status;
+} // hythread_wait_for_nondaemon_threads
+
+IDATA VMCALL hythread_increase_nondaemon_threads_count(hythread_t thread)
+{
+    hythread_library_t lib = thread->library;
+    IDATA status = hymutex_lock(&lib->TM_LOCK);
+    if (status != TM_ERROR_NONE) {
+        return status;
+    }
+    lib->nondaemon_thread_count++;
+    status = hymutex_unlock(&lib->TM_LOCK);
+    return status;
+} // hythread_increase_nondaemon_threads_count_in_library
+
+IDATA VMCALL hythread_decrease_nondaemon_threads_count(hythread_t thread, IDATA threads_to_keep)
+{
+    hythread_library_t lib = thread->library;
+    IDATA status = hymutex_lock(&lib->TM_LOCK);
+    if (status != TM_ERROR_NONE) {
+        return status;
+    }
+
+    if (lib->nondaemon_thread_count <= 0) {
+        status = hymutex_unlock(&lib->TM_LOCK);
+        if (status != TM_ERROR_NONE) {
+            return status;
+        }
+        return TM_ERROR_ILLEGAL_STATE;
+    }
+
+    TRACE(("TM: nondaemons decreased, thread: %p count: %d\n", thread,
+           lib->nondaemon_thread_count));
+
+    lib->nondaemon_thread_count--;
+    if (lib->nondaemon_thread_count - threads_to_keep <= 0) {
+        status = hycond_notify_all(&lib->nondaemon_thread_cond);
+        TRACE(("TM: nondaemons all dead, thread: %p count: %d\n", thread,
+               lib->nondaemon_thread_count));
+        if (status != TM_ERROR_NONE) {
+            hymutex_unlock(&lib->TM_LOCK);
+            return status;
+        }
+    }
+
+    status = hymutex_unlock(&lib->TM_LOCK);
+    return status;
+} // hythread_countdown_nondaemon_threads

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=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_condvar.c Mon Jul 16 12:32:35 2007
@@ -50,11 +50,11 @@
         return TM_ERROR_INTERRUPT;
     }
 
-    disable_count = reset_suspend_disable(); 
+    disable_count = hythread_reset_suspend_disable();
 
     r = os_cond_timedwait(cond, mutex, ms, nano);
 
-    set_suspend_disable(disable_count);
+    hythread_set_suspend_disable(disable_count);
     self->current_condition = NULL;
    
     // check interrupted flag

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c Mon Jul 16 12:32:35 2007
@@ -223,9 +223,9 @@
         hymutex_unlock(&mon_ptr->mutex);
         hythread_safe_point();
         hythread_exception_safe_point();
-        save_count = reset_suspend_disable();
+        save_count = hythread_reset_suspend_disable();
         hymutex_lock(&mon_ptr->mutex);
-        set_suspend_disable(save_count);
+        hythread_set_suspend_disable(save_count);
     }
 
     mon_ptr->recursion_count = saved_recursion;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c Mon Jul 16 12:32:35 2007
@@ -23,7 +23,7 @@
 #include "thread_private.h"
 #include <open/hythread_ext.h>
 
-static int interrupter_thread_function(void *args);
+static IDATA HYTHREAD_PROC interrupter_thread_function(void *args);
 
 /** 
  * Interrupt a thread.
@@ -65,7 +65,7 @@
     hymutex_unlock(&thread->mutex);
 }
 
-static int interrupter_thread_function(void *args) {
+static IDATA HYTHREAD_PROC interrupter_thread_function(void *args) {
     hythread_t thread = (hythread_t)args; 
     hythread_monitor_t monitor = NULL;
     hymutex_lock(&thread->mutex);

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c Mon Jul 16 12:32:35 2007
@@ -429,9 +429,9 @@
 /**
  * Reset disable_count for currect thread.
  * The method begins suspension safe region.
- * Field disable_count is restored in set_suspend_disable() function.
+ * Field disable_count is restored in hythread_set_suspend_disable() function.
  */
-int reset_suspend_disable()
+int VMCALL hythread_reset_suspend_disable()
 {
     hythread_t self = tm_self_tls;
     int disable_count = self->disable_count;
@@ -442,12 +442,12 @@
 
 /**
  * Restores disable_count for current thread,
- * which was reset in reset_suspend_disable() function
+ * which was reset in hythread_reset_suspend_disable() function
  * If restored value ends suspension safe region
  * and there was a suspension request set for this thread,
  * the method invokes hythread_safe_point() function.
  */
-void set_suspend_disable(int count)
+void VMCALL hythread_set_suspend_disable(int count)
 {
     hythread_t self = tm_self_tls;
 

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c Mon Jul 16 12:32:35 2007
@@ -34,6 +34,11 @@
  */
 //@{
 
+#if !defined (_IPF_)
+// spin with try_lock SPIN_COUNT times
+#define SPIN_COUNT 5
+#endif // !defined (_IPF_)
+
 /*
  * 32bit lock word
  *           |0|------15bit-------|--5bit--|1bit|--10bit------|
@@ -65,7 +70,7 @@
 
 HyFatLockTable *lock_table = NULL;
 
-IDATA owns_thin_lock(hythread_t thread, I_32 lockword) {
+IDATA VMCALL hythread_owns_thin_lock(hythread_t thread, hythread_thin_monitor_t lockword) {
     IDATA this_id = thread->thread_id;
     assert(!IS_FAT_LOCK(lockword));
 #ifdef LOCK_RESERVATION
@@ -100,15 +105,14 @@
     return lockword;
 }
 
-IDATA is_fat_lock(hythread_thin_monitor_t lockword) {
-    return IS_FAT_LOCK(lockword);
+int VMCALL hythread_is_fat_lock(hythread_thin_monitor_t lockword) {
+    return (int)IS_FAT_LOCK(lockword);
 }
 
 //forward declaration
 hythread_monitor_t locktable_get_fat_monitor(IDATA lock_id);
 IDATA locktable_put_fat_monitor(hythread_monitor_t fat_monitor);
 hythread_monitor_t locktable_delete_entry(int lock_id);
-hythread_monitor_t inflate_lock(hythread_thin_monitor_t *lockword_ptr);
 
 //DEBUG INFO BLOCK
 //char *vm_get_object_class_name(void* ptr);
@@ -131,8 +135,8 @@
 void unreserve_self_lock(hythread_thin_monitor_t *lockword_ptr) {
     U_32 lockword = *lockword_ptr;
     U_32 lockword_new;
-    TRACE(("unreserve self_id %d lock owner %d", hythread_get_id(hythread_self()), THREAD_ID(lockword)));
-    assert(hythread_get_id(hythread_self()) == THREAD_ID(lockword));
+    TRACE(("unreserve self_id %d lock owner %d", hythread_get_self_id(), THREAD_ID(lockword)));
+    assert(hythread_get_self_id() == THREAD_ID(lockword));
     assert (!IS_FAT_LOCK(*lockword_ptr));
     assert (IS_RESERVED(lockword));
     TRACE(("Unreserved self %d \n", ++unreserve_count_self/*, vm_get_object_class_name(lockword_ptr-1)*/));  
@@ -150,10 +154,11 @@
 }
           
 
-/*
+/**
  * Used lockword
+ * Thin monitor functions used java monitor.
  */
-IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {
+IDATA VMCALL hythread_unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {
     U_32 lockword = *lockword_ptr;
     U_32 lockword_new;
     uint16 lock_id;
@@ -251,7 +256,7 @@
     return TM_ERROR_NONE;
 }
 #else
-IDATA unreserve_lock(I_32* lockword_ptr) {
+IDATA VMCALL hythread_unreserve_lock(hythread_thin_monitor_t* lockword_ptr) {
     return TM_ERROR_NONE;
 }
 #endif 
@@ -304,7 +309,7 @@
     if (lock_id == this_id) {    
         if (RECURSION(lockword) == MAX_RECURSION) {
             //inflate lock in case of recursion overflow
-            fat_monitor =inflate_lock(lockword_ptr);
+            fat_monitor = hythread_inflate_lock(lockword_ptr);
             return hythread_monitor_try_enter(fat_monitor);
             //break FAT_LOCK;
         } else {
@@ -366,7 +371,7 @@
 #ifdef LOCK_RESERVATION
         // unreserved busy lock
             else if (IS_RESERVED(lockword)) {
-                status = unreserve_lock(lockword_ptr);
+                status = hythread_unreserve_lock(lockword_ptr);
                 if (status != TM_ERROR_NONE) {
 #ifdef SPIN_COUNT
                     if (status == TM_ERROR_EBUSY) {
@@ -407,9 +412,9 @@
         if (IS_FAT_LOCK(*lockword_ptr)) {
             fat_monitor = locktable_get_fat_monitor(FAT_LOCK_ID(*lockword_ptr)); //  find fat_monitor in lock table
             TRACE((" lock %d\n", FAT_LOCK_ID(*lockword_ptr)));
-            saved_disable_count=reset_suspend_disable();
+            saved_disable_count = hythread_reset_suspend_disable();
             status = hythread_monitor_enter(fat_monitor);
-            set_suspend_disable(saved_disable_count);
+            hythread_set_suspend_disable(saved_disable_count);
             return status; // lock fat_monitor
         } 
         //hythread_safe_point();
@@ -420,7 +425,7 @@
         return TM_ERROR_NONE;
     }
     TRACE(("inflate_contended  thin_lcok%d\n", ++inflate_contended));   
-    inflate_lock(lockword_ptr);
+    hythread_inflate_lock(lockword_ptr);
     return TM_ERROR_NONE;
 }
 
@@ -470,13 +475,13 @@
   
     if (!IS_FAT_LOCK(lockword)) {
         // check if the current thread owns lock
-        if (!owns_thin_lock(this_thread, lockword)) {
+        if (!hythread_owns_thin_lock(this_thread, lockword)) {
             TRACE(("ILLEGAL_STATE %wait d\n", FAT_LOCK_ID(lockword)));
             return TM_ERROR_ILLEGAL_STATE;  
         }    
         TRACE(("inflate_wait%d\n", ++inflate_waited));  
         // if it is not a thin lock, inflate it
-        fat_monitor = inflate_lock(lockword_ptr);
+        fat_monitor = hythread_inflate_lock(lockword_ptr);
     } else {
         // otherwise, get the appropriate fat lock
         fat_monitor = locktable_get_fat_monitor(FAT_LOCK_ID(lockword));
@@ -552,7 +557,7 @@
         return hythread_monitor_notify(fat_monitor); 
     }
     // check if the current thread owns lock
-    if (!owns_thin_lock(tm_self_tls, lockword)) {
+    if (!hythread_owns_thin_lock(tm_self_tls, lockword)) {
         return TM_ERROR_ILLEGAL_STATE;  
     }    
   
@@ -573,7 +578,7 @@
         return hythread_monitor_notify_all(fat_monitor); 
     }
     // check if the current thread owns lock
-    if (!owns_thin_lock(tm_self_tls, lockword)) {
+    if (!hythread_owns_thin_lock(tm_self_tls, lockword)) {
         return TM_ERROR_ILLEGAL_STATE;  
     }    
     return TM_ERROR_NONE;
@@ -599,7 +604,7 @@
 /*
  * Inflates the compressed lockword into fat fat_monitor
  */
-hythread_monitor_t VMCALL inflate_lock(hythread_thin_monitor_t *lockword_ptr) {
+hythread_monitor_t VMCALL hythread_inflate_lock(hythread_thin_monitor_t *lockword_ptr) {
     hythread_monitor_t fat_monitor;
     IDATA status;
     IDATA fat_monitor_id;
@@ -626,7 +631,7 @@
     assert(!IS_RESERVED(lockword));
 #endif 
 
-    assert(owns_thin_lock(tm_self_tls, lockword));
+    assert(hythread_owns_thin_lock(tm_self_tls, lockword));
     assert(!hythread_is_suspend_enabled());
 
     TRACE (("inflation begin for %x thread: %d", lockword, tm_self_tls->thread_id));
@@ -644,7 +649,7 @@
     }     
     fat_monitor_id = locktable_put_fat_monitor(fat_monitor); // put fat_monitor into lock table
     set_fat_lock_id(lockword_ptr, fat_monitor_id);
-    TRACE(("inflate_lock  %d thread: %d\n", FAT_LOCK_ID(*lockword_ptr), tm_self_tls->thread_id));
+    TRACE(("hythread_inflate_lock  %d thread: %d\n", FAT_LOCK_ID(*lockword_ptr), tm_self_tls->thread_id));
     //assert(FAT_LOCK_ID(*lockword_ptr) != 2);
     TRACE(("FAT ID : 0x%x", *lockword_ptr));
     fat_monitor->inflate_count++;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c Mon Jul 16 12:32:35 2007
@@ -191,15 +191,4 @@
     return ((UDATA)&((hythread_t)0)->thread_local_storage) + (key * sizeof(void*));
 }
 
-
-/*
- * Class:     org_apache_harmony_drlvm_thread_ThreadHelper
- * Method:    getThreadIdOffset
- * Signature: ()I
- */
-jint JNICALL Java_org_apache_harmony_drlvm_thread_ThreadHelper_getThreadIdOffset(JNIEnv *e, jclass c) {
-    return (uint32)&((HyThread *)0)->thread_id;
-}
-
-
 //@}

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h Mon Jul 16 12:32:35 2007
@@ -50,27 +50,10 @@
 #define RET_ON_ERROR(stat) if (stat) { return -1; }
 #define CONVERT_ERROR(stat)     (stat)
 
-#define MAX_OWNED_MONITOR_NUMBER 200 //FIXME: switch to dynamic resize
 #define FAST_LOCAL_STORAGE_SIZE 10
 
 #define INITIAL_FAT_TABLE_ENTRIES 16*1024   //make this table exapandible if workloads show it is necessary
 
-#define HY_DEFAULT_STACKSIZE 512 * 1024 // if default stack size is not through -Xss parameter, it is 256kb
-
-
-#if !defined (_IPF_)
-//use lock reservation
-#define LOCK_RESERVATION
-// spin with try_lock SPIN_COUNT times
-#define SPIN_COUNT 5
-
-#endif // !defined (_IPF_)
-
-#if defined(_WIN32) && !defined (_EM64T_)
-//use optimized asm monitor enter and exit helpers 
-#define ASM_MONITOR_HELPER
-#endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -136,7 +119,7 @@
      *    2. hythread_exception_safe_point()
      *          - removes safe point callback request for current thread
      */
-    int32 request;
+    uint32 request;
 
     /**
      * Field indicating that thread can safely be suspended.
@@ -147,7 +130,7 @@
      * for current thread only.
      *
      * Also disable_count could be reset to value 0 and restored in
-     * reset_suspend_disable()/set_suspend_disable() function
+     * hythread_set_suspend_disable()/hythread_set_suspend_disable() function
      * for current thread only.
      *
      * Function hythread_exception_safe_point() sets disable_count to
@@ -160,7 +143,6 @@
      */
     int16 disable_count;
 
-
     /**
      * Group for this thread. Different groups are needed in order 
      * to be able to quickly iterate over the specific group.
@@ -191,8 +173,7 @@
      * After increment/decrement of suspend_count, request field
      * should be incremented/decremented too.
      */
-    int32 suspend_count;
-    
+    uint32 suspend_count;
         
     /**
      * Function to be executed at safepoint upon thread resume.
@@ -226,23 +207,7 @@
      * Handle to OS thread.
      */
     osthread_t os_handle;
-        
-    /**
-     * Placeholder for any data to be associated with this thread.
-     * Java layer is using it to keep java-specific context.
-     */
-    void *private_data;
-
-    /**
-     * Flag indicating there was request to exit
-     */
-    Boolean exit_request; 
     
-    /**
-     * Exit value of this thread
-     */
-    IDATA exit_value; 
-
 
 // Synchronization stuff
 
@@ -278,11 +243,6 @@
 
 // Attributes
 
-    /**
-     * name of the thread (useful for debugging purposes)
-     */
-    char* name;
-
    /**
     * Hint for scheduler about thread priority
     */
@@ -298,7 +258,7 @@
     
     /**
      *  Monitor this thread is waiting on now.
-     **/
+     */
     hythread_monitor_t waited_monitor;
 
     /**
@@ -306,108 +266,8 @@
      */
     IDATA thread_id;
 
-    /**
-     * APR thread attributes
-     */
-    apr_threadattr_t *apr_attrs;
-
-    /**
-     * Extension to the standard local storage slot.
-     */
-    void **big_local_storage;
-       
 } HyThread;
 
-
-/**
- * Java-specific context that is attached to tm_thread control structure by Java layer
- */
-typedef struct JVMTIThread {
-    
-    /**
-     * JNI env associated with this Java thread
-     */
-    JNIEnv *jenv;
-       
-    /**
-     * jthread object which is associated with tm_thread
-     */
-    jthread thread_object;
-       
-    /**
-     * Conditional variable which is used to wait/notify on java monitors.
-     */
-    hycond_t monitor_condition;
-
-    /**
-     * Exception that has to be thrown in stopped thread
-     */
-    jthrowable stop_exception;
-
-    /**
-     * Blocked on monitor times count
-     */
-     jlong blocked_count;
-       
-    /**
-     * Blocked on monitor time in nanoseconds
-     */
-     jlong blocked_time;
-       
-    /**
-     * Waited on monitor times count
-     */
-     jlong waited_count;
-       
-    /**
-     * Waited on monitor time in nanoseconds
-     */
-     jlong waited_time;
-       
-    /**
-     * JVM TI local storage
-     */
-     JVMTILocalStorage jvmti_local_storage;
-
-    /**
-     * Monitor this thread is blocked on.
-     */
-     jobject contended_monitor;
-
-    /**
-     * Monitor this thread waits on.
-     */
-     jobject wait_monitor;
-
-    /**
-     * Monitors for which this thread is owner.
-     */
-     jobject *owned_monitors;
-
-    /**
-     * owned monitors count.
-     */
-     int owned_monitors_nmb;
-
-    /**
-     * APR pool for this structure
-     */
-     apr_pool_t *pool;
-
-     /**
-      * weak reference to corresponding java.lang.Thread instance
-      */
-     jobject thread_ref;
-
-     /**
-      * Is this thread daemon?
-      */
-     IDATA daemon;
-
-} JVMTIThread;
-
-
-
 /** 
   * hythread_group_t pointer to the first element in the thread group
   */
@@ -599,8 +459,6 @@
 
 extern int max_group_index;     // max number of groups
 
-extern int total_started_thread_count; // Total started thread counter.
-
 extern HyFatLockTable *lock_table;
 
 #define THREAD_ID_SIZE 16  //size of thread ID in bits. Also defines max number of threads
@@ -610,23 +468,6 @@
 /**
 * Internal TM functions
 */
-
-/**
-* tm_reset_suspend_disable() reset <code>suspend_disable</code> to 0, and return old value. 
-* It should be used with tm_set_suspend_disable() to implement safe points
-* Will be used in tm_safe_point(), tm_mutex_lock(), tm_cond_wait().
-*/
-
-int reset_suspend_disable();
-void set_suspend_disable(int count);
-
-/* thin monitor functions used java monitor
- */
-IDATA is_fat_lock(hythread_thin_monitor_t lockword);
-IDATA owns_thin_lock(hythread_t thread, I_32 lockword);
-hythread_monitor_t inflate_lock(hythread_thin_monitor_t *lockword_ptr);
-IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr);
-
 IDATA VMCALL hythread_get_group(hythread_group_t *group, hythread_t thread);
 /**
  *  Auxiliary function to throw java.lang.InterruptedException
@@ -654,34 +495,6 @@
 IDATA thin_monitor_wait_impl(hythread_thin_monitor_t *lockword_ptr, I_64 ms, IDATA nano, IDATA interruptable);
 IDATA sem_wait_impl(hysem_t sem, I_64 ms, IDATA nano, IDATA interruptable);
 
-typedef struct ResizableArrayEntry {
-    void *entry;
-    UDATA next_free;
-} ResizableArrayEntry;
-
-typedef struct ResizableArrayEntry *array_entry_t; 
-
-typedef struct ResizableArrayType {
-    UDATA size;
-    UDATA capacity;
-    UDATA next_index;
-    array_entry_t entries;
-} ResizableArrayType;
-typedef struct ResizableArrayType *array_t;
-
-
-IDATA array_create(array_t *array);
-IDATA array_destroy(array_t array);
-UDATA array_add(array_t array, void *value);
-void *array_delete(array_t array, UDATA index);
-void *array_get(array_t array, UDATA index);
-
-/**
- *  Auxiliary function to update thread count
- */
-void thread_start_count();
-void thread_end_count();
-
 /*
  * portability functions, private for thread module
  */
@@ -691,7 +504,7 @@
 osthread_t os_thread_current();
 int os_thread_cancel(osthread_t);
 int os_thread_join(osthread_t);
-void os_thread_exit(int status);
+void os_thread_exit(IDATA status);
 void os_thread_yield_other(osthread_t);
 int os_get_thread_times(osthread_t os_thread, int64* pkernel, int64* puser);
 

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/win/os_thread.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/win/os_thread.c?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/win/os_thread.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/win/os_thread.c Mon Jul 16 12:32:35 2007
@@ -119,7 +119,7 @@
  *
  * @param status        returns status of a thread
  */
-void os_thread_exit(int status)
+void os_thread_exit(IDATA status)
 {
     ExitThread(status);
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h Mon Jul 16 12:32:35 2007
@@ -50,7 +50,7 @@
 class JIT;
 struct Global_Env;
 class Package;
-class VM_thread;
+struct VM_thread;
 struct AnnotationTable;
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/exceptions_type.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/exceptions_type.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/exceptions_type.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/exceptions_type.h Mon Jul 16 12:32:35 2007
@@ -30,11 +30,12 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+
 struct Exception {
-    ManagedObject* exc_object;
-    Class* exc_class;
+    struct ManagedObject* exc_object;
+    struct Class* exc_class;
     const char* exc_message;
-    ManagedObject* exc_cause;
+    struct ManagedObject* exc_cause;
 };
 
 #ifdef __cplusplus

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h Mon Jul 16 12:32:35 2007
@@ -372,11 +372,11 @@
 jvmtiError jvmti_get_next_bytecodes_from_native(VM_thread *thread,
     jvmti_StepLocation **next_step, unsigned *count, bool invoked_frame);
 void jvmti_set_single_step_breakpoints(DebugUtilsTI *ti,
-    VM_thread *vm_thread, jvmti_StepLocation *locations,
+    jvmti_thread_t jvmti_thread, jvmti_StepLocation *locations,
     unsigned locations_number);
 void jvmti_set_single_step_breakpoints_for_method(DebugUtilsTI *ti,
-    VM_thread *vm_thread, Method* method);
-void jvmti_remove_single_step_breakpoints(DebugUtilsTI *ti, VM_thread *vm_thread);
+    jvmti_thread_t jvmti_thread, Method* method);
+void jvmti_remove_single_step_breakpoints(DebugUtilsTI *ti, jvmti_thread_t jvmti_thread);
 
 // Object check functions
 Boolean is_valid_thread_object(jthread thread);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/native_stack.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/native_stack.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/native_stack.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/native_stack.h Mon Jul 16 12:32:35 2007
@@ -54,7 +54,7 @@
 int native_test_unwind_special(native_module_t* modules, void* sp);
 bool native_unwind_special(native_module_t* modules,
                 void* stack, void** ip, void** sp, void** bp, bool is_last);
-void native_unwind_interrupted_frame(VM_thread* pthread, void** p_ip, void** p_bp, void** p_sp);
+void native_unwind_interrupted_frame(jvmti_thread_t thread, void** p_ip, void** p_bp, void** p_sp);
 bool native_is_ip_in_modules(native_module_t* modules, void* ip);
 bool native_is_ip_stub(void* ip);
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h Mon Jul 16 12:32:35 2007
@@ -14,29 +14,256 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-/** 
- * @author Andrey Chernyshev
- * @version $Revision: 1.1.2.1.4.4 $
- */  
-
 
 #ifndef THREAD_MANAGER_HEADER
 #define THREAD_MANAGER_HEADER
 
-#include "vm_threads.h"
-
+#include "open/jthread.h"
+#include "open/thread_externals.h"
+#include "exceptions_type.h"
+
+#define GC_BYTES_IN_THREAD_LOCAL (20 * sizeof(void *))
+#define CONVERT_ERROR(stat)	(stat)
+#define TM_JVMTI_MAX_BUFFER_SIZE 50
 
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 
-void free_this_thread_block(VM_thread *);
-VM_thread * get_a_thread_block(JavaVM_Internal * java_vm);
-VM_thread * allocate_thread_block(JavaVM_Internal * java_vm);
-
-extern volatile VM_thread *p_the_safepoint_control_thread;  // only set when a gc is happening
-extern volatile safepoint_state global_safepoint_status;
+struct jvmti_frame_pop_listener;
+struct JVMTISingleStepState;
+struct ClassLoader;
+
+/**
+ * These are thread level gc states.
+ */
+enum gc_state {
+    zero = 0,
+    gc_moving_to_safepoint,
+    gc_at_safepoint,
+    gc_enumeration_done
+};
+
+/**
+ * Java-specific context that is attached to tm_thread control structure by Java layer
+ */
+struct JVMTIThread
+{
+    /**
+     * Blocked on monitor times count
+     */
+    jlong blocked_count;
+
+    /**
+     * Blocked on monitor time in nanoseconds
+     */
+    jlong blocked_time;
+
+    /**
+     * Waited on monitor times count
+     */
+    jlong waited_count;
+
+    /**
+     * Waited on monitor time in nanoseconds
+     */
+    jlong waited_time;
+
+    /**
+     * JVM TI local storage
+     */
+    JVMTILocalStorage jvmti_local_storage;
+
+    /**
+     * Monitor this thread is blocked on.
+     */
+    jobject contended_monitor;
+
+    /**
+     * Monitor this thread waits on.
+     */
+    jobject wait_monitor;
+
+    /**
+     * Monitors for which this thread is owner.
+     */
+    jobject *owned_monitors;
+
+    /**
+     * owned monitors count.
+     */
+    int owned_monitors_nmb;
+
+    /**
+     * For support of JVMTI events: EXCEPTION, EXCEPTION_CATCH
+     * If p_exception_object is set and p_exception_object_ti is not
+     *    - EXCEPTION event should be generated
+     * If p_exception_object_ti is set and p_exception_object is not
+     *     - EXCEPTION_CATCH even should be generated
+     */
+    volatile struct ManagedObject *p_exception_object_ti;
+
+    /**
+     * Buffer used to create instructions instead of original instruction
+     * to transfer execution control back to the code after breakpoint
+     * has been processed
+     */
+    jbyte *jvmti_jit_breakpoints_handling_buffer;
+
+    struct jvmti_frame_pop_listener *frame_pop_listener;
+    struct JVMTISingleStepState *ss_state;
+    void *jvmti_saved_exception_registers;
+};
+
+struct VM_thread
+{
+    /**
+     * Native thread which is associated with VM_thread
+     */
+    hythread_t native_thread;
+
+    /**
+     * Java thread object to corresponding java.lang.Thread instance
+     */
+    jobject java_thread;
+
+    /**
+     * Thread reference object to corresponding java.lang.ThreadWeakRef instance
+     */
+    jobject weak_ref;
+
+    /**
+     * Exception that has to be thrown in stopped thread
+     */
+    jthrowable stop_exception;
+
+    /**
+     * Memory pool where this structure is allocated.
+     * This pool should be used by current thread for memory allocations.
+     */
+    apr_pool_t *pool;
+
+    /**
+     * JNI environment associated with this thread.
+     */
+    JNIEnv *jni_env;
+
+    /**
+     * Class loader which loads native library and calls to its JNI_OnLoad
+     */
+    struct ClassLoader *onload_caller;
+
+    /**
+    * Flag to detect if a class is not found on bootclasspath,
+    * as opposed to linkage errors.
+    * Used for implementing default delegation model.
+    */
+    unsigned char class_not_found;
+
+    // In case exception is thrown, Exception object is put here
+    volatile struct Exception thread_exception;
+
+    // flag which indicate that guard page on the stak should be restored
+    unsigned char restore_guard_page;
+
+    // thread stack address
+    void *stack_addr;
+
+    // thread stack size
+    UDATA stack_size;
+
+    // ??
+    enum gc_state gc_status;
+    int finalize_thread_flags;
+
+    // CPU registers.
+    void *regs;
+
+    // This field is private the to M2nFrame module, init code should set it to NULL
+    // Informational frame - created when native is called from Java,
+    // used to store local handles (jobjects) + registers.
+    // =0 if there is no m2n frame.
+    void *last_m2n_frame;
+
+    // GC Information
+    unsigned char _gc_private_information[GC_BYTES_IN_THREAD_LOCAL];
+    void *native_handles;
+    void *gc_frames;
+
+#if defined(PLATFORM_POSIX) && defined(_IPF_)
+    // Linux/IPF
+    hysem_t suspend_self;   // To suspend current thread for signal handler
+    uint64 suspended_state; // Flag to indicate how the one thread is suspended
+                            // Possible values:
+                            // NOT_SUSPENDED, 
+                            // SUSPENDED_IN_SIGNAL_HANDLER,
+                            // SUSPENDED_IN_DISABLE_GC_FOR_THREAD
+    uint64 t[2];    // t[0] <= rnat, t[1] <= bspstore for current thread context
+                    // t[0] <= rnat, t[1] <= bsp      for other   thread context
+#endif
 
+    void *lastFrame;
+    void *firstFrame;
+    int interpreter_state;
+
+    /**
+     * The upper boundary of the stack to scan when verifying stack enumeration
+     */
+    void **stack_end;
+    
+    /**
+     * Is this thread daemon?
+     */
+    IDATA daemon;
+
+    /**
+     * JVMTI support in thread structure
+     */
+    struct JVMTIThread jvmti_thread;
+};
+
+/**
+ * Java thread creation attributes.
+ */
+struct jthread_thread_attr
+{
+    /**
+     * Pointer to Java VM.
+     */
+    JavaVM *java_vm;
+
+    /**
+     * Thread scheduling priority.
+     */
+    jint priority;
+
+    /**
+     * Thread stack size.
+     */
+    UDATA stacksize;
+
+    /**
+     * Denotes whether Java thread is daemon.  
+     * JVM exits when the only threads running are daemon threads.
+     */
+    jboolean daemon;
+
+    /**
+     * JVMTI environment.
+     */
+    jvmtiEnv *jvmti_env;
+
+    /**
+     * JVMTI start function to be executed in this thread.
+     */
+    jvmtiStartFunction proc;
+
+    /**
+     * Start function argument to the start function. Is passed as an array.
+     */
+    const void *arg;
+};
 
 #ifdef __cplusplus
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_core_types.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_core_types.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_core_types.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_core_types.h Mon Jul 16 12:32:35 2007
@@ -44,7 +44,7 @@
 struct M2nFrame;
 struct ManagedObject;
 class  NativeObjectHandles;
-class  VM_thread;
+struct VM_thread;
 class  Package;
 class  Package_Table;
 class  Properties;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h Mon Jul 16 12:32:35 2007
@@ -14,16 +14,10 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-/** 
- * @author Andrey Chernyshev
- * @version $Revision: 1.1.2.2.4.4 $
- */  
-
 
 #ifndef _VM_THREADS_H_
 #define _VM_THREADS_H_
 
-
 #ifdef PLATFORM_POSIX
 #include <semaphore.h>
 #include "platform_lowlevel.h"
@@ -34,175 +28,110 @@
 #include <apr_pools.h>
 
 #include "open/types.h"
-//#include "open/hythread.h"
-#include <open/hythread_ext.h>
+#include "open/hythread.h"
+#include "open/hythread_ext.h"
 #include "open/ti_thread.h"
-
-#include "vm_core_types.h"
-#include "object_layout.h"
+#include "open/jthread.h"
 #include "open/vm_gc.h"
-#include "exceptions_type.h"
+
 #include "jvmti.h"
 #include "jni_direct.h"
+#include "thread_manager.h"
+#include "vm_core_types.h"
+#include "object_layout.h"
 
-
-// 
 #define tmn_suspend_disable assert(hythread_is_suspend_enabled());hythread_suspend_disable
 #define tmn_suspend_enable assert(!hythread_is_suspend_enabled());hythread_suspend_enable
 #define tmn_suspend_disable_recursive hythread_suspend_disable
 #define tmn_suspend_enable_recursive hythread_suspend_enable
 
-#define GC_BYTES_IN_THREAD_LOCAL (20 * sizeof(void *))
-
-// These are thread level gc states. 
-enum gc_state {
-    zero = 0,
-    gc_moving_to_safepoint,
-    gc_at_safepoint,
-    gc_enumeration_done
-};
-
-
-struct jvmti_frame_pop_listener;
-struct JVMTISingleStepState;
-
-class VmRegisterContext;
-
-class VM_thread {
-
-public:
-    /**
-     * Memory pool where this structure is allocated.
-     * This pool should be used by current thread for memory allocations.
-     */
-    apr_pool_t * pool;
-
-    /**
-     * JNI environment associated with this thread.
-     */
-    JNIEnv_Internal * jni_env;
-
-    /**
-     * Class loader which loads native library and calls to its JNI_OnLoad
-     */
-    ClassLoader* onload_caller;
-
-    /**
-    * Flag to detect if a class is not found on bootclasspath,
-    * as opposed to linkage errors.
-    * Used for implementing default delegation model.
-    */
-    bool class_not_found;
-
-    // In case exception is thrown, Exception object is put here
-    // TODO: Needs to be replaced with jobject!
-    //volatile ManagedObject*           p_exception_object;
-    volatile Exception thread_exception;
-
-    // For support of JVMTI events: EXCEPTION, EXCEPTION_CATCH
-    // If p_exception_object is set and p_exception_object_ti is not
-    //    - EXCEPTION event should be generated
-    // If p_exception_object_ti is set and p_exception_object is not
-    //    - EXCEPTION_CATCH even should be generated
-    volatile ManagedObject*           p_exception_object_ti;
-
-    // flag which indicate that guard page on the stak should be restored
-    bool restore_guard_page;
-
-    // thread stack address
-    void* stack_addr;
-
-    // thread stack size
-    unsigned int stack_size;
-
-    // Should JVMTI code be notified about exception in p_exception_object
-    bool                              ti_exception_callback_pending;
-
-    // ??
-    gc_state                          gc_status; 
-    int                               finalize_thread_flags;
-    // Flag indicating whether thread stopped. Duplicate of thread_state?
-    bool                              is_stoped;
-
-    JVMTILocalStorage                 jvmti_local_storage;
-    // Buffer used to create instructions instead of original instruction
-    // to transfer execution control back to the code after breakpoint
-    // has been processed
-    jbyte                             jvmti_jit_breakpoints_handling_buffer[50];
-    jvmti_frame_pop_listener          *frame_pop_listener;
-    JVMTISingleStepState              *ss_state;
-    Registers                         jvmti_saved_exception_registers;
-
-    // CPU registers.
-    Registers                         regs;
-
-    // This field is private the to M2nFrame module, init code should set it to NULL
-    // Informational frame - created when native is called from Java,
-    // used to store local handles (jobjects) + registers.
-    // =0 if there is no m2n frame.
-    M2nFrame*                         last_m2n_frame;
-
-    // GC Information
-    Byte                              _gc_private_information[GC_BYTES_IN_THREAD_LOCAL];
-    NativeObjectHandles*              native_handles;
-    GcFrame*                          gc_frames;
-    //gc_enable_disable_state           gc_enabled_status;
-    bool                              gc_wait_for_enumeration;
-    bool                              restore_context_after_gc_and_resume;
-
-#if defined(PLATFORM_POSIX) && defined(_IPF_)
-    // Linux/IPF
-    sem_t                             suspend_sem;     // To suspend thread in signal handler
-    sem_t                             suspend_self;    // To suspend current thread for signal handler
-    uint64                            suspended_state; // Flag to indicate how the one thread is suspended
-                                                       // Possible values:
-                               // NOT_SUSPENDED, 
-                               // SUSPENDED_IN_SIGNAL_HANDLER,
-                               // SUSPENDED_IN_DISABLE_GC_FOR_THREAD
-    uint64                            t[2]; // t[0] <= rnat, t[1] <= bspstore for current thread context
-                                            // t[0] <= rnat, t[1] <= bsp      for other   thread context
-#endif
-
-    void *lastFrame;
-    void *firstFrame;
-    int interpreter_state;
-    void** stack_end;       /// The upper boundary of the stack to scan when verifying stack enumeration
+typedef VM_thread *vm_thread_accessor();
+VMEXPORT extern vm_thread_accessor *get_thread_ptr;
 
-    void* get_ip_from_regs() { return regs.get_ip(); }
-    void reset_regs_ip() { return regs.reset_ip(); }
+inline void vm_set_exception_registers(VM_thread * thread, Registers & regs)
+{
+    if (!thread->regs) {
+        thread->regs = malloc(sizeof(Registers));
+        assert(thread->regs);
+    }
+    *(Registers *) thread->regs = regs;
+}
 
+inline void *vm_get_ip_from_regs(VM_thread * thread)
+{
+    return ((Registers *) thread->regs)->get_ip();
+}
 
-};
+inline void vm_reset_ip_from_regs(VM_thread * thread)
+{
+    ((Registers *) thread->regs)->reset_ip();
+}
 
-typedef  VM_thread *vm_thread_accessor();
-VMEXPORT extern vm_thread_accessor *get_thread_ptr;
+inline jvmti_thread_t jthread_get_jvmti_thread(hythread_t native_thread)
+{
+    assert(native_thread);
+    vm_thread_t vm_thread =
+        (vm_thread_t)hythread_tls_get(native_thread, TM_THREAD_VM_TLS_KEY);
+    if (!vm_thread) {
+        return NULL;
+    }
+    return &(vm_thread->jvmti_thread);
+}
 
-//VMEXPORT VM_thread *get_vm_thread(hythread_t thr);
-//VMEXPORT VM_thread *get_vm_thread_self();
+inline jvmti_thread_t jthread_self_jvmti()
+{
+    return jthread_get_jvmti_thread(hythread_self());
+}
 
-inline VM_thread *get_vm_thread_fast_self() {
-	register hythread_t thr = hythread_self();
+inline void vm_set_jvmti_saved_exception_registers(VM_thread * thread,
+                                                   Registers & regs)
+{
+    assert(thread);
+    assert(&thread->jvmti_thread);
+    jvmti_thread_t jvmti_thread = &thread->jvmti_thread;
+    if (!jvmti_thread->jvmti_saved_exception_registers) {
+        jvmti_thread->jvmti_saved_exception_registers = malloc(sizeof(Registers));
+        assert(jvmti_thread->jvmti_saved_exception_registers);
+    }
+    *(Registers *) jvmti_thread->jvmti_saved_exception_registers = regs;
+}
 
-    return thr ? ((VM_thread *)hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY)) : NULL;
+inline VM_thread *get_vm_thread_fast_self()
+{
+    register hythread_t thr = hythread_self();
+    return thr ? ((VM_thread *) hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY)) :
+        NULL;
 }
 
-inline VM_thread *get_vm_thread(hythread_t thr) {
+inline VM_thread *get_vm_thread(hythread_t thr)
+{
     if (thr == NULL) {
         return NULL;
     }
-    return (VM_thread *)hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY);
+    return (VM_thread *) hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY);
 }
 
 VMEXPORT void init_TLS_data();
 
-VMEXPORT void set_TLS_data(VM_thread *thread) ;
+VMEXPORT void set_TLS_data(VM_thread * thread);
 uint16 get_self_stack_key();
 
 #define p_TLS_vmthread (get_vm_thread_fast_self())
 
-Registers *thread_gc_get_context(VM_thread *, VmRegisterContext &);
+//Registers *thread_gc_get_context(VM_thread *, VmRegisterContext &);
 void thread_gc_set_context(VM_thread *);
 
-struct Global_Env;
+/**
+ *  Auxiliary function to update thread count
+ */
+void jthread_start_count();
+void jthread_end_count();
+
+vm_thread_t jthread_allocate_vm_thread(hythread_t native_thread);
+jint jthread_allocate_vm_thread_pool(JavaVM * java_vm, vm_thread_t vm_thread);
+void jthread_deallocate_vm_thread_pool(vm_thread_t vm_thread);
+
+extern volatile VM_thread *p_the_safepoint_control_thread;      // only set when a gc is happening
+extern volatile safepoint_state global_safepoint_status;
 
 #endif //!_VM_THREADS_H_

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp Mon Jul 16 12:32:35 2007
@@ -252,11 +252,11 @@
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     if (ti->isEnabled() && ti->is_single_step_enabled())
     {
-        VM_thread *vm_thread = p_TLS_vmthread;
+        jvmti_thread_t jvmti_thread = jthread_self_jvmti();
         ti->vm_brpt->lock();
-        if (NULL != vm_thread->ss_state)
+        if (NULL != jvmti_thread->ss_state)
         {
-            jvmti_remove_single_step_breakpoints(ti, vm_thread);
+            jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
         }
         ti->vm_brpt->unlock();
     }
@@ -318,9 +318,9 @@
                     // Start single step in exception handler
                     if (ti->isEnabled() && ti->is_single_step_enabled())
                     {
-                        VM_thread *vm_thread = p_TLS_vmthread;
+                        jvmti_thread_t jvmti_thread = jthread_self_jvmti();
                         ti->vm_brpt->lock();
-                        if (NULL != vm_thread->ss_state)
+                        if (NULL != jvmti_thread->ss_state)
                         {
                             uint16 bc;
                             NativeCodePtr ip = handler->get_handler_ip();
@@ -330,7 +330,7 @@
 
                             jvmti_StepLocation method_start = {(Method *)method, ip, bc, false};
 
-                            jvmti_set_single_step_breakpoints(ti, vm_thread,
+                            jvmti_set_single_step_breakpoints(ti, jvmti_thread,
                                 &method_start, 1);
                         }
                         ti->vm_brpt->unlock();

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp Mon Jul 16 12:32:35 2007
@@ -266,14 +266,14 @@
     if (thread->thread_exception.exc_cause != NULL) {
         vm_enumerate_root_reference((void **)&(thread->thread_exception.exc_cause), FALSE);
     }
-    if (thread->p_exception_object_ti != NULL) {
-        vm_enumerate_root_reference((void **)&(thread->p_exception_object_ti), FALSE);
+    if (thread->jvmti_thread.p_exception_object_ti != NULL) {
+        vm_enumerate_root_reference((void **)&(thread->jvmti_thread.p_exception_object_ti), FALSE);
     }
 
     if (thread->native_handles)
-        thread->native_handles->enumerate();
+        ((NativeObjectHandles*)(thread->native_handles))->enumerate();
     if (thread->gc_frames) {
-        thread->gc_frames->enumerate();
+        ((GcFrame*)(thread->gc_frames))->enumerate();
     }
 } //vm_enumerate_root_set_single_thread_not_on_stack
 

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=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp Mon Jul 16 12:32:35 2007
@@ -604,7 +604,7 @@
     }
     assert(native_thread);
 
-    status = vm_attach(java_vm, &jni_env, NULL);
+    status = vm_attach(java_vm, &jni_env);
     if (status != JNI_OK) return status;
 
     *p_jni_env = jni_env;
@@ -723,7 +723,7 @@
     extern void initialize_signals();
     initialize_signals(); 
 
-    status = vm_attach(java_vm, &jni_env, NULL);
+    status = vm_attach(java_vm, &jni_env);
     if (status != JNI_OK) return status;
     
     // "Tool Interface" initialization

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/compile.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/compile.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/compile.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/compile.cpp Mon Jul 16 12:32:35 2007
@@ -812,7 +812,9 @@
     if(ti->isEnabled() && ti->is_single_step_enabled()
         && !method->is_native())
     {
-        jvmti_set_single_step_breakpoints_for_method(ti, p_TLS_vmthread, method);
+        jvmti_thread_t jvmti_thread = jthread_self_jvmti();
+        assert(jvmti_thread);
+        jvmti_set_single_step_breakpoints_for_method(ti, jvmti_thread, method);
     }
 
     return entry_point;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/ini.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/ini.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/ini.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jit/ini.cpp Mon Jul 16 12:32:35 2007
@@ -54,7 +54,9 @@
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     if(ti->isEnabled() && ti->is_single_step_enabled()) {
         // Start single stepping a new Java method
-        jvmti_set_single_step_breakpoints_for_method(ti, p_TLS_vmthread, (Method*)method);
+        jvmti_thread_t jvmti_thread = jthread_self_jvmti();
+        assert(jvmti_thread);
+        jvmti_set_single_step_breakpoints_for_method(ti, jvmti_thread, (Method*)method);
     }
 
     VM_Global_State::loader_env->em_interface->ExecuteMethod(method, result, args);
@@ -65,19 +67,20 @@
     if (ti->isEnabled() && ti->is_single_step_enabled())
     {
         VM_thread *vm_thread = p_TLS_vmthread;
+        jvmti_thread_t jvmti_thread = &vm_thread->jvmti_thread;
         LMAutoUnlock lock(ti->vm_brpt->get_lock());
-        if (NULL != vm_thread->ss_state)
+        if (NULL != jvmti_thread->ss_state)
         {
             // Start single stepping a new Java method
-            jvmti_remove_single_step_breakpoints(ti, vm_thread);
+            jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
 
             jvmti_StepLocation *method_return;
             unsigned locations_number;
             jvmtiError errorCode = jvmti_get_next_bytecodes_from_native(
-            vm_thread, &method_return, &locations_number, is_in_jni_method());
+                vm_thread, &method_return, &locations_number, is_in_jni_method());
             assert (JVMTI_ERROR_NONE == errorCode);
 
-            jvmti_set_single_step_breakpoints(ti , vm_thread, method_return, locations_number);
+            jvmti_set_single_step_breakpoints(ti, jvmti_thread, method_return, locations_number);
         }
     }
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp Mon Jul 16 12:32:35 2007
@@ -305,6 +305,9 @@
             break;
         }
     }
+    if (TRUE == get_boolean_property("vm.jvmti.enabled", FALSE, VM_PROPERTIES)) {
+        p_env->TI->setEnabled();
+    }
 }
 
 DebugUtilsTI::DebugUtilsTI() :

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_break_intf.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_break_intf.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_break_intf.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_break_intf.cpp Mon Jul 16 12:32:35 2007
@@ -593,7 +593,8 @@
     // JVMTI handles it, and registers context is saved for us in TLS
     VM_thread *vm_thread = p_TLS_vmthread;
     lock();
-    Registers regs = vm_thread->jvmti_saved_exception_registers;
+    Registers regs = 
+        *(Registers*)vm_thread->jvmti_thread.jvmti_saved_exception_registers;
     NativeCodePtr addr = (NativeCodePtr)regs.get_ip();
 
     TRACE2("jvmti.break", "Native breakpoint occured: " << addr);
@@ -703,7 +704,7 @@
     // Registers in TLS can be changed in user callbacks
     // It should be restored to keep original address of instrumented instruction
     // Exception/signal handlers use it when HWE occurs in instruction buffer
-    vm_thread->jvmti_saved_exception_registers = regs;
+    vm_set_jvmti_saved_exception_registers(vm_thread, regs);
     unlock();
 
     // Now we need to return back to normal code execution, it is
@@ -714,7 +715,8 @@
     // special handling.
     InstructionDisassembler::Type type = idisasm.get_type();
 
-    instruction_buffer = vm_thread->jvmti_jit_breakpoints_handling_buffer;
+    instruction_buffer =
+        vm_thread->jvmti_thread.jvmti_jit_breakpoints_handling_buffer;
     jbyte *interrupted_instruction = (jbyte *)addr;
     jint instruction_length = idisasm.get_length_with_prefix();
 
@@ -1367,7 +1369,7 @@
     // Store possibly corrected location
     regs->set_ip((void*)native_location);
     // Copy original registers to TLS
-    vm_thread->jvmti_saved_exception_registers = *regs;
+    vm_set_jvmti_saved_exception_registers(vm_thread, *regs);
     // Set return address for exception handler
 #if defined (PLATFORM_POSIX) || defined(_EM64T_)
     regs->set_ip((void*)process_native_breakpoint_event);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp Mon Jul 16 12:32:35 2007
@@ -247,7 +247,7 @@
             return JVMTI_ERROR_INVALID_THREAD;
 
         jint thread_state;
-        IDATA UNUSED status = jthread_get_state(event_thread, &thread_state);
+        IDATA UNUSED status = jthread_get_jvmti_state(event_thread, &thread_state);
         assert(status == TM_ERROR_NONE);
 
         if (!(thread_state & JVMTI_THREAD_STATE_ALIVE))
@@ -876,7 +876,7 @@
     jint depth = get_thread_stack_depth(curr_thread);
 
 #ifndef NDEBUG
-    if( curr_thread->frame_pop_listener ) {
+    if( curr_thread->jvmti_thread.frame_pop_listener ) {
         TRACE2("jvmti.stack", "Prepare to PopFrame callback for thread: "
             << curr_thread << ", method: " << class_get_name(method_get_class((Method*)method))
             << "." << method_get_name((Method*)method)
@@ -887,9 +887,9 @@
 #endif // NDEBUG
 
     jvmti_frame_pop_listener *last = NULL;
-    for( jvmti_frame_pop_listener *fpl = curr_thread->frame_pop_listener;
+    for( jvmti_frame_pop_listener *fpl = curr_thread->jvmti_thread.frame_pop_listener;
          fpl;
-         last = fpl, (fpl = fpl ? fpl->next : curr_thread->frame_pop_listener) )
+         last = fpl, (fpl = fpl ? fpl->next : curr_thread->jvmti_thread.frame_pop_listener) )
     {
         TRACE2("jvmti.stack", "-> Look through listener: "
             << fpl << ", env: " << fpl->env << ", depth: " << fpl->depth);
@@ -900,7 +900,7 @@
             if(last) {
                 last->next = fpl->next;
             } else {
-                curr_thread->frame_pop_listener = fpl->next;
+                curr_thread->jvmti_thread.frame_pop_listener = fpl->next;
             }
             fpl = last;
 
@@ -1376,7 +1376,6 @@
 
     VM_thread *curr_thread = p_TLS_vmthread;
     hythread_t curr_native_thread=hythread_self();
-    curr_thread->ti_exception_callback_pending = false;
 
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     assert(ti->isEnabled());
@@ -2025,17 +2024,17 @@
     if (!ti->is_single_step_enabled())
         return;
 
+    jvmti_thread_t jvmti_thread = jthread_self_jvmti();
     if (is_start)
     {
         // Init single step state for the thread
-        VM_thread *vm_thread = p_TLS_vmthread;
         LMAutoUnlock lock(ti->vm_brpt->get_lock());
 
         jvmtiError UNREF errorCode = _allocate(sizeof(JVMTISingleStepState),
-            (unsigned char **)&vm_thread->ss_state);
+            (unsigned char **)&jvmti_thread->ss_state);
         assert(JVMTI_ERROR_NONE == errorCode);
 
-        vm_thread->ss_state->predicted_breakpoints = NULL;
+        jvmti_thread->ss_state->predicted_breakpoints = NULL;
 
         // There is no need to set a breakpoint in a thread which
         // is started inside of jvmti_send_thread_start_end_event() function.
@@ -2047,16 +2046,15 @@
     else
     {
         // Shut down single step state for the thread
-        VM_thread *vm_thread = p_TLS_vmthread;
         LMAutoUnlock lock(ti->vm_brpt->get_lock());
 
-        jvmti_remove_single_step_breakpoints(ti, vm_thread);
-        if( vm_thread->ss_state ) {
-            if( vm_thread->ss_state->predicted_breakpoints ) {
-                ti->vm_brpt->release_intf(vm_thread->ss_state->predicted_breakpoints);
+        jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
+        if( jvmti_thread->ss_state ) {
+            if( jvmti_thread->ss_state->predicted_breakpoints ) {
+                ti->vm_brpt->release_intf(jvmti_thread->ss_state->predicted_breakpoints);
             }
-            _deallocate((unsigned char *)vm_thread->ss_state);
-            vm_thread->ss_state = NULL;
+            _deallocate((unsigned char *)jvmti_thread->ss_state);
+            jvmti_thread->ss_state = NULL;
         }
     }
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp Mon Jul 16 12:32:35 2007
@@ -38,7 +38,8 @@
 static void jvmti_pop_frame_callback()
 {
     TRACE(("JVMTI PopFrame callback is called"));
-    frame_type type = m2n_get_frame_type(p_TLS_vmthread->last_m2n_frame);
+    frame_type type =
+		m2n_get_frame_type((M2nFrame*)(p_TLS_vmthread->last_m2n_frame));
 
     // frame wasn't requested to be popped
     if (FRAME_POP_NOW != (FRAME_POP_NOW & type)) {
@@ -307,11 +308,11 @@
     DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
     if (ti->isEnabled() && ti->is_single_step_enabled())
     {
-        VM_thread *vm_thread = p_TLS_vmthread;
+        jvmti_thread_t jvmti_thread = jthread_self_jvmti();
         LMAutoUnlock lock(ti->vm_brpt->get_lock());
-        if (NULL != vm_thread->ss_state) {
+        if (NULL != jvmti_thread->ss_state) {
             // remove old single step breakpoints
-            jvmti_remove_single_step_breakpoints(ti, vm_thread);
+            jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
 
             // set new single step breakpoints
             CodeChunkInfo *cci = si_get_code_chunk_info(si);
@@ -324,7 +325,7 @@
             assert(EXE_ERROR_NONE == result);
 
             jvmti_StepLocation locations = {method, ip, bc, false};
-            jvmti_set_single_step_breakpoints(ti, vm_thread, &locations, 1);
+            jvmti_set_single_step_breakpoints(ti, jvmti_thread, &locations, 1);
         }
     }
     return;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_roots.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_roots.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_roots.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_roots.cpp Mon Jul 16 12:32:35 2007
@@ -268,14 +268,14 @@
     if (thread->thread_exception.exc_cause != NULL) {
         vm_enumerate_root_reference((void **)&(thread->thread_exception.exc_cause), FALSE);
     }
-    if (thread->p_exception_object_ti != NULL) {
-        vm_enumerate_root_reference((void **)&(thread->p_exception_object_ti), FALSE);
+    if (thread->jvmti_thread.p_exception_object_ti != NULL) {
+        vm_enumerate_root_reference((void **)&(thread->jvmti_thread.p_exception_object_ti), FALSE);
     }
 
     if (thread->native_handles)
-        thread->native_handles->enumerate();
+        ((NativeObjectHandles*)(thread->native_handles))->enumerate();
     if (thread->gc_frames) {
-        thread->gc_frames->enumerate();
+        ((GcFrame*)(thread->gc_frames))->enumerate();
     }
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp Mon Jul 16 12:32:35 2007
@@ -872,8 +872,8 @@
 
         new_listener->depth = jsi.get_depth() - depth;
         new_listener->env = reinterpret_cast<TIEnv *>(env);
-        new_listener->next = vm_thread->frame_pop_listener;
-        vm_thread->frame_pop_listener = new_listener;
+        new_listener->next = vm_thread->jvmti_thread.frame_pop_listener;
+        vm_thread->jvmti_thread.frame_pop_listener = new_listener;
 
         TRACE("Pop listener is created: thread: "
             << vm_thread << ", listener: " << new_listener

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_step.cpp Mon Jul 16 12:32:35 2007
@@ -443,25 +443,25 @@
 static void
 jvmti_setup_jit_single_step(DebugUtilsTI *ti, Method* m, jlocation location)
 {
-    VM_thread* vm_thread = p_TLS_vmthread;
+    jvmti_thread_t jvmti_thread = jthread_self_jvmti();
     jvmti_StepLocation *locations;
     unsigned locations_count;
 
-    jvmti_SingleStepLocation(vm_thread, m, (unsigned)location,
+    jvmti_SingleStepLocation(p_TLS_vmthread, m, (unsigned)location,
                             &locations, &locations_count);
 
     // lock breakpoints
     VMBreakPoints* vm_brpt = VM_Global_State::loader_env->TI->vm_brpt;
     LMAutoUnlock lock(vm_brpt->get_lock());
 
-    jvmti_remove_single_step_breakpoints(ti, vm_thread);
+    jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
 
-    jvmti_set_single_step_breakpoints(ti, vm_thread, locations, locations_count);
+    jvmti_set_single_step_breakpoints(ti, jvmti_thread, locations, locations_count);
 }
 
 void
 jvmti_set_single_step_breakpoints_for_method(DebugUtilsTI *ti,
-                                             VM_thread *vm_thread,
+                                             jvmti_thread_t jvmti_thread,
                                              Method *method)
 {
     if (ti->isEnabled() && ti->is_single_step_enabled())
@@ -470,12 +470,12 @@
             return;
 
         LMAutoUnlock lock(ti->vm_brpt->get_lock());
-        if (NULL != vm_thread->ss_state)
+        if (NULL != jvmti_thread->ss_state)
         {
-            jvmti_remove_single_step_breakpoints(ti, vm_thread);
+            jvmti_remove_single_step_breakpoints(ti, jvmti_thread);
 
             jvmti_StepLocation method_start = {method, NULL, 0, false};
-            jvmti_set_single_step_breakpoints(ti, vm_thread, &method_start, 1);
+            jvmti_set_single_step_breakpoints(ti, jvmti_thread, &method_start, 1);
         }
     }
 }
@@ -485,7 +485,10 @@
 {
 #if (defined _IA32_) || (defined _EM64T_)
     VM_thread *vm_thread = p_TLS_vmthread;
-    Registers *regs = &vm_thread->jvmti_saved_exception_registers;
+    assert(vm_thread);
+    jvmti_thread_t jvmti_thread = &vm_thread->jvmti_thread;
+    assert(jvmti_thread);
+    Registers regs = *(Registers*)(jvmti_thread->jvmti_saved_exception_registers);
     // This is a virtual breakpoint set exactly on the call
     // instruction for the virtual method. In this place it is
     // possible to determine the target method in runtime
@@ -500,11 +503,11 @@
         // Invokevirtual uses indirect call from VTable. The base
         // address is in the register, offset is in displacement *
         // scale. This method is much faster than 
-        VTable* vtable = (VTable*)disasm->get_reg_value(op.base, regs);
+        VTable* vtable = (VTable*)disasm->get_reg_value(op.base, &regs);
         assert(vtable);
         // For x86 based architectures offset cannot be longer than 32
         // bits, so unsigned is ok here
-        unsigned offset = (unsigned)((POINTER_SIZE_INT)disasm->get_reg_value(op.index, regs) *
+        unsigned offset = (unsigned)((POINTER_SIZE_INT)disasm->get_reg_value(op.index, &regs) *
             op.scale + op.disp);
         method = class_get_method_from_vt_offset(vtable, offset);
     }
@@ -513,7 +516,7 @@
         // This is invokeinterface bytecode which uses register
         // call so we need to search through all methods for this
         // one to find it, no way to get vtable and offset in it
-        NativeCodePtr ip = disasm->get_target_address_from_context(regs);
+        NativeCodePtr ip = disasm->get_target_address_from_context(&regs);
         Global_Env * vm_env = jni_get_vm_env(vm_thread->jni_env);
         CodeChunkInfo *cci = vm_env->vm_methods->find(ip);
         if (cci)
@@ -547,7 +550,7 @@
     // The determined method is the one which is called by
     // invokevirtual or invokeinterface bytecodes. It should be
     // started to be single stepped from the beginning
-    jvmti_set_single_step_breakpoints_for_method(ti, vm_thread, method);
+    jvmti_set_single_step_breakpoints_for_method(ti, jvmti_thread, method);
 #else
     NOT_IMPLEMENTED;
 #endif
@@ -570,7 +573,9 @@
         return false;
 
     ti->vm_brpt->lock();
-    JVMTISingleStepState* sss = p_TLS_vmthread->ss_state;
+    jvmti_thread_t jvmti_thread = jthread_self_jvmti();
+    assert(jvmti_thread);
+    JVMTISingleStepState* sss = jvmti_thread->ss_state;
 
     if (!sss || !ti->is_single_step_enabled()) {
         ti->vm_brpt->unlock();
@@ -677,13 +682,13 @@
     return true;
 }
 
-void jvmti_set_single_step_breakpoints(DebugUtilsTI *ti, VM_thread *vm_thread,
+void jvmti_set_single_step_breakpoints(DebugUtilsTI *ti, jvmti_thread_t jvmti_thread,
     jvmti_StepLocation *locations, unsigned locations_number)
 {
     // Function is always executed under global TI breakpoints lock
     ASSERT_NO_INTERPRETER;
 
-    JVMTISingleStepState *ss_state = vm_thread->ss_state;
+    JVMTISingleStepState *ss_state = jvmti_thread->ss_state;
     if( NULL == ss_state ) {
         // no need predict next step due to single step is off
         return;
@@ -730,10 +735,10 @@
     }
 }
 
-void jvmti_remove_single_step_breakpoints(DebugUtilsTI *ti, VM_thread *vm_thread)
+void jvmti_remove_single_step_breakpoints(DebugUtilsTI *ti, jvmti_thread_t jvmti_thread)
 {
     // Function is always executed under global TI breakpoints lock
-    JVMTISingleStepState *ss_state = vm_thread->ss_state;
+    JVMTISingleStepState *ss_state = jvmti_thread->ss_state;
 
     TRACE2("jvmti.break.ss", "Remove single step breakpoints, intf: "
         << (ss_state ? ss_state->predicted_breakpoints : NULL) );
@@ -937,17 +942,25 @@
     // Set single step in all threads
     while ((ht = hythread_iterator_next(&threads_iterator)) != NULL)
     {
-        VM_thread *vm_thread = get_vm_thread(ht);
+        vm_thread_t vm_thread =
+            (vm_thread_t)hythread_tls_get(ht, TM_THREAD_VM_TLS_KEY);
         if( !vm_thread ) {
-            // Skip thread that isn't started yet. SingleStep state
-            // will be enabled for it in
+            // Skip thread that isn't started yet.
+            // SingleStep state will be enabled for it in
+            // jvmti_send_thread_start_end_event()
+            continue;
+        }
+        jvmti_thread_t jvmti_thread = &vm_thread->jvmti_thread;
+        if( !jvmti_thread ) {
+            // Skip thread that isn't started yet.
+            // SingleStep state will be enabled for it in
             // jvmti_send_thread_start_end_event
             continue;
         }
 
         // Init single step state for the thread
         jvmtiError errorCode = _allocate(sizeof(JVMTISingleStepState),
-            (unsigned char **)&vm_thread->ss_state);
+            (unsigned char **)&jvmti_thread->ss_state);
 
         if (JVMTI_ERROR_NONE != errorCode)
         {
@@ -955,7 +968,7 @@
             return errorCode;
         }
 
-        vm_thread->ss_state->predicted_breakpoints = NULL;
+        jvmti_thread->ss_state->predicted_breakpoints = NULL;
 
         jvmti_StepLocation *locations;
         unsigned locations_number;
@@ -969,7 +982,7 @@
             return errorCode;
         }
 
-        jvmti_set_single_step_breakpoints(this, vm_thread, locations, locations_number);
+        jvmti_set_single_step_breakpoints(this, jvmti_thread, locations, locations_number);
     }
     
     single_step_enabled = true;
@@ -1014,20 +1027,20 @@
     // Clear single step in all threads
     while ((ht = hythread_iterator_next(&threads_iterator)) != NULL)
     {
-        VM_thread *vm_thread = get_vm_thread(ht);
-        if( !vm_thread ) {
+        jvmti_thread_t jvmti_thread = jthread_get_jvmti_thread(ht);
+        if( !jvmti_thread ) {
             // Skip thread that isn't started yet. No need to disable
             // SingleStep state for it
             continue;
         }
 
-        if( vm_thread->ss_state ) {
-            jvmti_remove_single_step_breakpoints(this, vm_thread);
-            if( vm_thread->ss_state->predicted_breakpoints ) {
-                vm_brpt->release_intf(vm_thread->ss_state->predicted_breakpoints);
+        if( jvmti_thread->ss_state ) {
+            jvmti_remove_single_step_breakpoints(this, jvmti_thread);
+            if( jvmti_thread->ss_state->predicted_breakpoints ) {
+                vm_brpt->release_intf(jvmti_thread->ss_state->predicted_breakpoints);
             }
-            _deallocate((unsigned char *)vm_thread->ss_state);
-            vm_thread->ss_state = NULL;
+            _deallocate((unsigned char *)jvmti_thread->ss_state);
+            jvmti_thread->ss_state = NULL;
         }
     }
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_thread.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_thread.cpp Mon Jul 16 12:32:35 2007
@@ -81,7 +81,7 @@
     if (thread_state_ptr == NULL){
         return JVMTI_ERROR_NULL_POINTER;
     }
-    IDATA UNUSED status = jthread_get_state(thread, thread_state_ptr);
+    IDATA UNUSED status = jthread_get_jvmti_state(thread, thread_state_ptr);
     assert(status == TM_ERROR_NONE);
 
     return JVMTI_ERROR_NONE;
@@ -469,7 +469,7 @@
     }
 
     jint thread_state;
-    IDATA UNUSED status = jthread_get_state(thread, &thread_state);
+    IDATA UNUSED status = jthread_get_jvmti_state(thread, &thread_state);
     assert(status == TM_ERROR_NONE);
 
     if (! (JVMTI_THREAD_STATE_ALIVE & thread_state))
@@ -697,15 +697,16 @@
     CallVoidMethod(jvmti_test_jenv, thread, set_daemon, JNI_TRUE);
 
     jni_env = jthread_get_JNI_env(jthread_self());
+
     // Run new thread
-    // FIXME TM integration, pass arguments correctly
-    //Java_java_lang_Thread_start_generic(jvmti_test_jenv, thread, env, proc, arg, priority);
-    jthread_threadattr_t attrs;
+    jthread_threadattr_t attrs = {0};
     attrs.priority = priority; 
-    attrs.stacksize = 0;
     attrs.daemon = JNI_TRUE;
     attrs.jvmti_env = env;
-    jthread_create_with_function(jni_env, thread, &attrs, proc, arg);
+    attrs.proc = proc;
+    attrs.arg = arg;
+
+    jthread_create_with_function(jni_env, thread, &attrs);
 
     ti->setLocallyEnabled();//-----------------------------------^
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp Mon Jul 16 12:32:35 2007
@@ -29,6 +29,7 @@
 #include "open/ti_thread.h"
 #include "open/thread_externals.h"
 #include "jni_utils.h"
+#include "thread_manager.h"
 
 /*
  * Class:     java_lang_VMThreadManager
@@ -148,7 +149,7 @@
 JNIEXPORT jlong JNICALL Java_java_lang_VMThreadManager_init
   (JNIEnv *jenv, jclass clazz, jobject thread, jobject ref, jlong oldThread)
 {
-    return jthread_thread_init(NULL, jenv, thread, ref, oldThread);
+    return jthread_thread_init(jenv, thread, ref, (hythread_t)oldThread);
 }
 
 /*
@@ -159,11 +160,13 @@
 JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_start
   (JNIEnv *jenv, jclass clazz, jobject thread, jlong stackSize, jboolean daemon, jint priority)
 {
-    jthread_threadattr_t attrs;
+    jthread_threadattr_t attrs = {0};
 
     attrs.daemon = daemon;
     attrs.priority = priority;
-    attrs.stacksize = stackSize > 40000000? 0:(jint)stackSize;
+    // FIXME - may be define value 40000000
+    attrs.stacksize = stackSize > 40000000 ? 0:(jint)stackSize;
+
     return (jint)jthread_create(jenv, thread, &attrs);
 }
 
@@ -225,13 +228,7 @@
 
     tm_native_thread = (hythread_t )vm_jthread_get_tm_data((jthread)thread);
     assert(tm_native_thread);
-    if (hythread_is_alive(tm_native_thread))
-    { 
-        printf("isAlive\n");
-        return true;
-    }
-        printf ("isnot\n");
-    return false;
+    return hythread_is_alive(tm_native_thread) ? 1 : 0;
 }
 
 /*
@@ -256,7 +253,7 @@
     jint state;	
     IDATA stat;
     
-    stat = jthread_get_state(jthread, &state);
+    stat = jthread_get_jvmti_state(jthread, &state);
     assert(stat == TM_ERROR_NONE);
     return state;
 }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_lang_management_ThreadMXBeanImpl.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_lang_management_ThreadMXBeanImpl.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_lang_management_ThreadMXBeanImpl.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_lang_management_ThreadMXBeanImpl.cpp Mon Jul 16 12:32:35 2007
@@ -356,7 +356,7 @@
 {
     jint thread_state;
     TRACE2("management", "ThreadMXBeanImpl_isSuspendedImpl invocation");
-    IDATA UNUSED status = jthread_get_state(thread, &thread_state);
+    IDATA UNUSED status = jthread_get_jvmti_state(thread, &thread_state);
     assert(status == TM_ERROR_NONE);
     return thread_state & TM_THREAD_STATE_SUSPENDED;
 };

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp?view=diff&rev=556704&r1=556703&r2=556704
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp Mon Jul 16 12:32:35 2007
@@ -81,7 +81,7 @@
         nodes = gc_frame_node_new(size_hint);
     else
         nodes = NULL;
-    next = p_TLS_vmthread->gc_frames;
+    next = (GcFrame*)p_TLS_vmthread->gc_frames;
     p_TLS_vmthread->gc_frames = this;
 }
 
@@ -89,7 +89,7 @@
 {
     assert(!hythread_is_suspend_enabled());
 
-    assert(p_TLS_vmthread->gc_frames==this);
+    assert(((GcFrame*)p_TLS_vmthread->gc_frames) == this);
     p_TLS_vmthread->gc_frames = next;
     next = NULL;
     GcFrameNode* c;
@@ -331,14 +331,14 @@
 NativeObjectHandles::NativeObjectHandles()
 : handles(NULL)
 {
-    next = p_TLS_vmthread->native_handles;
+    next = (NativeObjectHandles*)p_TLS_vmthread->native_handles;
     p_TLS_vmthread->native_handles = this;
 }
 
 VMEXPORT // temporary solution for interpreter unplug
 NativeObjectHandles::~NativeObjectHandles()
 {
-    assert(p_TLS_vmthread->native_handles==this);
+    assert(((NativeObjectHandles*)p_TLS_vmthread->native_handles) == this);
     p_TLS_vmthread->native_handles = next;
     next = NULL;
     oh_free_handles(handles);
@@ -386,7 +386,7 @@
         m2n_set_local_handles(lm2nf, hs);
     } else {
         assert(p_TLS_vmthread->native_handles);
-        res = p_TLS_vmthread->native_handles->allocate();
+        res = ((NativeObjectHandles*)p_TLS_vmthread->native_handles)->allocate();
     }
     return res;
 }