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/03/29 17:51:51 UTC

svn commit: r523754 - in /harmony/enhanced/drlvm/trunk/vm: include/open/ thread/src/ vmcore/include/ vmcore/src/thread/ vmi/src/

Author: wjwashburn
Date: Thu Mar 29 08:51:49 2007
New Revision: 523754

URL: http://svn.apache.org/viewvc?view=rev&rev=523754
Log:
H3065, Thread-local Storage inlining
build, build test works on win32, win64, lin32, lin64

Modified:
    harmony/enhanced/drlvm/trunk/vm/include/open/hycomp.h
    harmony/enhanced/drlvm/trunk/vm/include/open/hythread.h
    harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
    harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
    harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_monitors.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
    harmony/enhanced/drlvm/trunk/vm/vmi/src/vmi.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/hycomp.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/hycomp.h?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hycomp.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hycomp.h Thu Mar 29 08:51:49 2007
@@ -78,8 +78,13 @@
  * </ul>
  */
 #ifdef LINUX
+#ifdef _EM64T_
+typedef long int I_64;
+typedef unsigned long int U_64;
+#else
 typedef long long I_64;
 typedef unsigned long long U_64;
+#endif
 
 typedef double SYS_FLOAT;
 #define HYCONST64(x) x##LL

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/hythread.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/hythread.h?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hythread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hythread.h Thu Mar 29 08:51:49 2007
@@ -21,10 +21,26 @@
 #if defined(__cplusplus)
 extern "C" {
 #endif
+#include <open/types.h>
+
 
 #include <stddef.h>
 #include "hycomp.h"
 
+/* 
+ * Idea behind these declarations is to make some functions static inlined for 
+ * all files that include hythread_ext.h/hythread.h except one, that 
+ * will export this functions in DLL 
+ */
+   
+#ifndef hy_inline
+#  ifdef PLATFORM_POSIX
+#    define hy_inline inline static
+#  else
+#     define hy_inline static __forceinline 
+#  endif //PLATFORM_POSIX
+#endif // hy_inline
+
 typedef UDATA hythread_tls_key_t;
 
 #define HYTHREAD_PROC VMCALL
@@ -32,6 +48,7 @@
 typedef IDATA (HYTHREAD_PROC* hythread_entrypoint_t)(void*);
 typedef void (HYTHREAD_PROC* hythread_tls_finalizer_t)(void*);
 typedef struct HyThread *hythread_t;
+typedef struct HyThreadGroup *hythread_group_t;
 typedef struct HyThreadMonitor *hythread_monitor_t;
 typedef struct HySemaphore *hysem_t;
 
@@ -104,6 +121,7 @@
 
 #define HYSIZEOF_HyThreadMonitorTracing 24
 
+
 extern HY_CFUNC void VMCALL
 hythread_detach PROTOTYPE((hythread_t thread));
 extern HY_CFUNC UDATA VMCALL
@@ -147,9 +165,12 @@
 hythread_monitor_init_with_name PROTOTYPE((hythread_monitor_t* handle, UDATA flags, char* name));
 extern HY_CFUNC IDATA VMCALL 
 hythread_monitor_try_enter PROTOTYPE((hythread_monitor_t monitor));
+extern HY_CFUNC hythread_t VMCALL
+hythread_self_slow PROTOTYPE(());
 extern HY_CFUNC void VMCALL 
 hythread_jlm_thread_clear PROTOTYPE((hythread_t thread));
-extern HY_CFUNC hythread_t VMCALL hythread_self PROTOTYPE((void));
+
+
 extern HY_CFUNC IDATA VMCALL 
 hythread_tls_free PROTOTYPE((hythread_tls_key_t key));
 extern HY_CFUNC UDATA VMCALL
@@ -245,8 +266,6 @@
 hythread_monitor_get_tracing PROTOTYPE((hythread_monitor_t monitor));
 extern HY_CFUNC UDATA VMCALL 
 hythread_get_priority PROTOTYPE((hythread_t thread));
-extern HY_CFUNC void* VMCALL
-hythread_tls_get PROTOTYPE((hythread_t thread, hythread_tls_key_t key));
 extern HY_CFUNC char* VMCALL 
 hythread_monitor_get_name PROTOTYPE((hythread_monitor_t monitor));
 extern HY_CFUNC hythread_monitor_t VMCALL 
@@ -284,6 +303,201 @@
 #define hythread_global_monitor() (*(hythread_monitor_t*)hythread_global("global_monitor"))
 #define hythread_monitor_init(pMon,flags)  hythread_monitor_init_with_name(pMon,flags, #pMon)
 #define hythread_monitor_set_name(pMon,pName)
+
+/**
+ * Native thread control structure's public fields.
+ */
+
+typedef struct HyThread_public {
+
+#ifndef POSIX
+    // This is dummy pointer for Microsoft Visual Studio debugging
+    // If this is removed, Visual Studio, when attached to VM, will show
+    // no symbolic information
+    void* reserved;
+#endif
+
+// Public fields exported by HyThread_public. If you change these fields,
+// please, check fields in thread_private.h/HyThread
+
+    /**
+     * Number of requests made for this thread, it includes both
+     * suspend requests and safe point callback requests.
+     * The field is modified by atomic operations.
+     *
+     * Increment in functions:
+     *    1. send_suspend_request()
+     *          - sets suspend request for a given thread
+     *    2. hythread_set_safepoint_callback()
+     *          - sets safe point callback request for a given thread
+     *
+     * Decrement in functions:
+     *    1. hythread_resume()
+     *          - removes suspend request for a given thread
+     *    2. hythread_exception_safe_point()
+     *          - removes safe point callback request for current thread
+     */
+    int32 request;
+
+    /**
+     * Field indicating that thread can safely be suspended.
+     * Safe suspension is enabled on value 0.
+     *
+     * The disable_count is increased/decreaded in
+     * hythread_suspend_disable()/hythread_suspend_enable() function
+     * for current thread only.
+     *
+     * Also disable_count could be reset to value 0 and restored in
+     * reset_suspend_disable()/set_suspend_disable() function
+     * for current thread only.
+     *
+     * Function hythread_exception_safe_point() sets disable_count to
+     * value 1 before safe point callback function calling and restores
+     * it after the call.
+     *
+     * Function thread_safe_point_impl() sets disable_count to
+     * value 0 before entering to the safe point and restores it
+     * after exitting.
+     */
+    int16 disable_count;
+
+
+    /**
+     * Group for this thread. Different groups are needed in order 
+     * to be able to quickly iterate over the specific group.
+     * Examples are: Java threads, GC private threads.
+     * Equal to the address of the head of the list of threads for this group.
+     */
+    hythread_group_t  group; 
+
+    /**
+     * Array representing thread local storage
+     */
+    void *thread_local_storage[10];
+
+} HyThread_public;
+
+
+
+/* 
+ * FS14_TLS_USE 
+ *
+ *  FS14_TLS_USE declaration turns on windows specific TLS access optimization
+ *  We use free TIB slot with 14 offset, see following article for details
+ *  http://www.microsoft.com/msj/archive/S2CE.aspx (currently it's used on
+ *  Windows 32-bit)
+ *
+ * APR_TLS_USE
+ *
+ *  When APR_TLS_USE is declared DRLVM uses APR functions for getting current
+ *  thread. (currently it's used only on Windows 64-bit)
+ *
+ * If none of these defined, current thread id is kept in the tm_self_tls 
+ * variable which is declared as __thread, thread local variable for gcc 
+ * (*note Thread-Local:: in gcc.info), in thread_native_basic.c. This 
+ * way it works on Linux.
+ */
+   
+
+
+#if defined WIN32 && !defined _EM64T_
+
+//use optimized asm monitor enter and exit helpers
+#define ASM_MONITOR_HELPER
+
+// FS14_TLS_USE define turns on windows specific TLS access optimization
+// We use free TIB slot with 14 offset, see following article for details
+// http://www.microsoft.com/msj/archive/S2CE.aspx
+#define FS14_TLS_USE
+
+#elif defined _EM64T_ && defined WINDOWS
+
+#define APR_TLS_USE
+#endif
+
+
+ 
+
+#ifdef APR_TLS_USE
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+hy_inline hythread_t VMCALL hythread_self() {
+    extern hythread_t hythread_self_slow();
+    return hythread_self_slow();
+}
+
+#define tm_self_tls (hythread_self_slow())
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#elif defined FS14_TLS_USE
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+hy_inline hythread_t VMCALL hythread_self() {
+    register hythread_t t;
+    _asm { mov eax, fs:[0x14]
+           mov t, eax;
+    }
+    return t;
+}
+
+#define tm_self_tls (hythread_self())
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#else
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef PLATFORM_POSIX
+extern __thread hythread_t tm_self_tls;
+#else
+extern __declspec(thread) hythread_t tm_self_tls;
+#endif //PLATFORM_POSIX
+
+
+hy_inline hythread_t VMCALL hythread_self() {
+    return tm_self_tls;
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * Returns a thread's TLS value.
+ */
+hy_inline void* VMCALL
+hythread_tls_get(hythread_t thread, hythread_tls_key_t key) {
+    return ((struct HyThread_public *)thread)->thread_local_storage[key];
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
 
 #if defined(__cplusplus)
 }

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h Thu Mar 29 08:51:49 2007
@@ -123,7 +123,17 @@
 extern "C" {
 #endif
 
-#include "hythread.h"
+#include "open/hythread.h"
+
+#include <open/types.h>
+#include <apr_pools.h>
+#include <apr_thread_mutex.h>
+#include <apr_thread_cond.h>
+#include <apr_thread_rwlock.h>
+#include <apr_portable.h>
+
+#include <assert.h>
+#include "apr_thread_ext.h"
 
 //@{
 /**
@@ -145,7 +155,7 @@
 
 
 typedef struct HyLatch *hylatch_t;
-typedef struct HyThreadGroup *hythread_group_t;
+
 typedef struct HyThread *hythread_iterator_t;
 typedef struct HyThreadLibrary *hythread_library_t;
 
@@ -153,6 +163,7 @@
 
 typedef void (*hythread_event_callback_proc)(void);
 
+ 
 //@}
 /** @name Thread Manager initialization / shutdown
  */
@@ -167,6 +178,7 @@
 void VMCALL hythread_shutdown();
 IDATA VMCALL hythread_lib_create(hythread_library_t * lib);
 void VMCALL hythread_lib_destroy(hythread_library_t lib);
+hythread_group_t VMCALL get_java_thread_group(void);
 
 //@}
 /** @name  Basic manipulation 
@@ -185,7 +197,7 @@
 hythread_t VMCALL hythread_get_thread(IDATA id);
 IDATA VMCALL hythread_struct_init(hythread_t *ret_thread);
 IDATA VMCALL hythread_cancel_all(hythread_group_t group);
- IDATA hythread_group_create(hythread_group_t *group);
+IDATA hythread_group_create(hythread_group_t *group);
 IDATA VMCALL hythread_group_release(hythread_group_t group);
 IDATA VMCALL hythread_group_get_list(hythread_group_t **list, int* size);
 void* VMCALL hythread_get_private_data(hythread_t  t);
@@ -214,10 +226,11 @@
  */
 //@{
 
-IDATA hythread_is_suspend_enabled();
-void hythread_suspend_enable();
-void hythread_suspend_disable();
+hy_inline IDATA VMCALL hythread_is_suspend_enabled();
+hy_inline void VMCALL hythread_suspend_enable();
+hy_inline void VMCALL hythread_suspend_disable();
 void hythread_safe_point();
+void hythread_safe_point_other(hythread_t thread);
 void VMCALL hythread_exception_safe_point();
 IDATA VMCALL hythread_suspend_other(hythread_t thread);
 
@@ -311,6 +324,102 @@
 int VMCALL hythread_is_in_native(hythread_t thread) ;
 int VMCALL hythread_is_daemon(hythread_t thread) ;
 
+
+
+
+// inline functions declarations
+
+
+/**
+ * Returns non-zero if thread is suspended.
+ */
+hy_inline IDATA VMCALL hythread_is_suspend_enabled(){
+    return ((HyThread_public *)tm_self_tls)->disable_count == 0;
+}
+
+
+/**
+ * Denotes the beginning of the code region where safe suspension is possible.
+ *
+ * The method decreases the disable_count field. The disable_count could be
+ * recursive, so safe suspension region is enabled on value 0.
+ *
+ * <p>
+ * A thread marks itself with functions hythread_suspend_enable()
+ * and hythread_suspend_disable() in order to denote a safe region of code.
+ * A thread may also call hythread_safe_point() method to denote a selected
+ * point where safe suspension is possible.
+ */
+hy_inline void VMCALL hythread_suspend_enable() {
+    assert(!hythread_is_suspend_enabled());
+
+#ifdef FS14_TLS_USE
+    // the macros could work for WIN32
+    __asm {
+        mov eax, fs:[0x14]
+        dec[eax] HyThread_public.disable_count
+    }
+#else
+    {
+        register hythread_t thread = tm_self_tls;
+        ((HyThread_public *)thread)->disable_count--;
+    }
+#endif
+}
+
+/**
+ * Denotes the end of the code region where safe suspension was possible.
+ *
+ * The method increases the disable_count field. The disable_count could be
+ * recursive, so safe suspension region is enabled on value 0.
+ * If there was a suspension request set for this thread, the method invokes
+ * hythread_safe_point().
+ * <p>
+ * A thread marks itself with functions hythread_suspend_enable()
+ * and hythread_suspend_disable() in order to denote a safe region of code.
+ * A thread may also call hythread_safe_point() method to denote a selected
+ * point where safe suspension is possible.
+ */
+hy_inline void VMCALL hythread_suspend_disable()
+{
+    register hythread_t thread;
+
+    // Check that current thread is in default thread group.
+    // Justification: GC suspends and enumerates threads from
+    // default group only.
+    assert(((HyThread_public *)tm_self_tls)->group == get_java_thread_group());
+
+#ifdef FS14_TLS_USE
+    // the macros could work for WIN32
+    __asm {
+        mov eax, fs:[0x14]
+        inc[eax] HyThread_public.disable_count
+        mov eax,[eax] HyThread_public.request
+        test eax, eax
+        jnz suspended
+    }
+    return;
+
+  suspended:
+    thread = tm_self_tls;
+
+#else
+    thread = tm_self_tls;
+    ((HyThread_public *)thread)->disable_count++;
+#endif
+
+    if (((HyThread_public *)thread)->request && 
+	((HyThread_public *)thread)->disable_count == 1) {
+        // enter to safe point if suspend request was set
+        // and suspend disable was made a moment ago
+        // (it's a point of entry to the unsafe region)
+        hythread_safe_point_other(thread);
+    }
+    return;
+}
+
+#define TM_THREAD_VM_TLS_KEY 0
+#define TM_THREAD_QUANTITY_OF_PREDEFINED_TLS_KEYS 1
 
  //@}
  /**

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def Thu Mar 29 08:51:49 2007
@@ -62,6 +62,7 @@
 hythread_suspend_disable
 hythread_exception_safe_point
 hythread_safe_point
+hythread_safe_point_other
 hythread_suspend_other
 hythread_set_safepoint_callback
 hythread_suspend_all
@@ -149,5 +150,6 @@
 array_delete
 array_get
 get_java_thread_group
+
 
 Java_org_apache_harmony_drlvm_thread_ThreadHelper_getThreadIdOffset

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp Thu Mar 29 08:51:49 2007
@@ -16,6 +16,7 @@
 hythread_monitor_init_with_name;
 hythread_monitor_try_enter;
 hythread_self;
+tm_self_tls;
 hythread_tls_free;
 hythread_yield;
 hythread_suspend;
@@ -61,6 +62,7 @@
 hythread_suspend_disable;
 hythread_exception_safe_point;
 hythread_safe_point;
+hythread_safe_point_other;
 hythread_suspend_other;
 hythread_set_safepoint_callback;
 hythread_suspend_all;
@@ -162,6 +164,7 @@
 get_java_thread_group;
 
 Java_org_apache_harmony_drlvm_thread_ThreadHelper_getThreadIdOffset;
+
 
 local: *;
 };

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c Thu Mar 29 08:51:49 2007
@@ -270,7 +270,7 @@
     return hymutex_unlock(&TM_LIBRARY->TM_LOCK);;
 }
 
-hythread_group_t  get_java_thread_group(void) {
+hythread_group_t VMCALL get_java_thread_group(void) {
     return TM_DEFAULT_GROUP;
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_monitors.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_monitors.c?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_monitors.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_monitors.c Thu Mar 29 08:51:49 2007
@@ -359,7 +359,7 @@
     return status;
 }
 
-void add_owned_monitor(jobject monitor) {
+void add_owned_monitor(jobject monitor){
     hythread_t tm_native_thread = hythread_self();
     jvmti_thread_t tm_java_thread = hythread_get_private_data(tm_native_thread);
     int disable_status;
@@ -415,7 +415,7 @@
     //assert(0); monitor - it is no valid monitor
 }
 
-void set_contended_monitor(jobject monitor) {
+void set_contended_monitor(jobject monitor){
     hythread_t tm_native_thread = hythread_self();
     IDATA suspend_status;
     
@@ -429,7 +429,7 @@
     set_suspend_disable(suspend_status);
 }
 
-void set_wait_monitor(jobject monitor) {
+void set_wait_monitor(jobject monitor){
     hythread_t tm_native_thread = hythread_self();
     IDATA suspend_status;
     

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c Thu Mar 29 08:51:49 2007
@@ -28,16 +28,22 @@
 #undef LOG_DOMAIN
 #define LOG_DOMAIN "tm.native"
 
+#ifdef PLATFORM_POSIX
+#   define hy_inline inline
+#else
+#   define hy_inline
+#endif //PLATFORM_POSIX
+
 #include <open/hythread_ext.h>
 #include "thread_private.h"
 
+
 typedef struct {
     hythread_t thread;
     hythread_group_t group;
     hythread_entrypoint_t start_proc;
     void * start_proc_args;
 } thread_start_proc_data;
-
 extern hythread_group_t TM_DEFAULT_GROUP;
 extern hythread_library_t TM_LIBRARY;
 static int VMAPICALL thread_start_proc(void *arg);
@@ -344,7 +350,7 @@
  * @see hythread_attach
  *
  */
-hythread_t hythread_self() {
+hythread_t hythread_self_slow() {
     hythread_t  thread;
     apr_status_t UNUSED apr_status;
     
@@ -370,11 +376,8 @@
  * @see hythread_attach
  *
  */
-NAKED hythread_t hythread_self() {
-    _asm { mov eax, fs:[0x14]
-           ret;
-    }
-    //return tm_self_tls;
+hythread_t hythread_self_slow() {
+    return hythread_self();
 }
 
 static void thread_set_self(hythread_t  thread) {
@@ -395,8 +398,8 @@
  * @see hythread_attach
  *
  */
-hythread_t hythread_self() {
-    return tm_self_tls;
+hythread_t hythread_self_slow() {
+    return hythread_self();
 }
 
 static void thread_set_self(hythread_t  thread) {
@@ -733,6 +736,7 @@
         monitor->recursion_count = 0;
         hythread_monitor_exit(monitor);
     }
+
     os_thread_exit(0);
     // unreachable statement
     abort();

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_suspend.c Thu Mar 29 08:51:49 2007
@@ -35,95 +35,6 @@
 //@{
 
 /**
- * Returns non-zero if thread is suspended.
- */
-IDATA VMCALL hythread_is_suspend_enabled()
-{
-    return tm_self_tls->disable_count == 0;
-}
-
-
-/**
- * Denotes the beginning of the code region where safe suspension is possible.
- *
- * The method decreases the disable_count field. The disable_count could be
- * recursive, so safe suspension region is enabled on value 0.
- *
- * <p>
- * A thread marks itself with functions hythread_suspend_enable()
- * and hythread_suspend_disable() in order to denote a safe region of code.
- * A thread may also call hythread_safe_point() method to denote a selected
- * point where safe suspension is possible.
- */
-void VMCALL hythread_suspend_enable()
-{
-    assert(!hythread_is_suspend_enabled());
-
-#ifdef FS14_TLS_USE
-    // the macros could work for WIN32
-    __asm {
-        mov eax, fs:[0x14]
-        dec[eax] HyThread.disable_count
-    }
-#else
-    {
-        register hythread_t thread = tm_self_tls;
-        thread->disable_count--;
-    }
-#endif
-}
-
-/**
- * Denotes the end of the code region where safe suspension was possible.
- *
- * The method increases the disable_count field. The disable_count could be
- * recursive, so safe suspension region is enabled on value 0.
- * If there was a suspension request set for this thread, the method invokes
- * hythread_safe_point().
- * <p>
- * A thread marks itself with functions hythread_suspend_enable()
- * and hythread_suspend_disable() in order to denote a safe region of code.
- * A thread may also call hythread_safe_point() method to denote a selected
- * point where safe suspension is possible.
- */
-void VMCALL hythread_suspend_disable()
-{
-    register hythread_t thread;
-
-    // Check that current thread is in default thread group.
-    // Justification: GC suspends and enumerates threads from
-    // default group only.
-    assert(tm_self_tls->group == TM_DEFAULT_GROUP);
-
-#ifdef FS14_TLS_USE
-    // the macros could work for WIN32
-    __asm {
-        mov eax, fs:[0x14]
-        inc[eax] HyThread.disable_count
-        mov eax,[eax] HyThread.request
-        test eax, eax
-        jnz suspended
-    }
-    return;
-
-  suspended:
-    thread = tm_self_tls;
-
-#else
-    thread = tm_self_tls;
-    thread->disable_count++;
-#endif
-
-    if (thread->request && thread->disable_count == 1) {
-        // enter to safe point if suspend request was set
-        // and suspend disable was made a moment ago
-        // (it's a point of entry to the unsafe region)
-        thread_safe_point_impl(thread);
-    }
-    return;
-}
-
-/**
  * Denotes a single point where safe exception throwing is possible.
  */
 void VMCALL hythread_exception_safe_point()
@@ -189,6 +100,16 @@
 {
     thread_safe_point_impl(tm_self_tls);
 }
+
+/**
+ * Same as hythread_safe_point, but inserts safe point for given thread 
+ * other thread.
+ */
+void VMCALL hythread_safe_point_other(hythread_t thread)
+{
+    thread_safe_point_impl(tm_self_tls);
+}
+
 
 /**
  * Denotes a single point where safe suspension is

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=523754&r1=523753&r2=523754
==============================================================================
--- 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 Thu Mar 29 08:51:49 2007
@@ -112,8 +112,8 @@
     I_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));
-    assert(!IS_FAT_LOCK(*lockword_ptr));
-    assert(IS_RESERVED(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)*/));  
        
     // Set reservation bit to 1 and reduce recursion 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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_tls.c Thu Mar 29 08:51:49 2007
@@ -29,7 +29,7 @@
 //@{
 
 int16 tm_tls_capacity = 16;
-int16 tm_tls_size = 0;
+int16 tm_tls_size = TM_THREAD_QUANTITY_OF_PREDEFINED_TLS_KEYS;
 
 static void tls_finalizer_placeholder(void *args) {}
 
@@ -73,13 +73,6 @@
     }
 
     return -1;
-}
-
-/**
- * Returns a thread's TLS value.
- */
-void* VMCALL hythread_tls_get(hythread_t thread, hythread_tls_key_t key) {
-    return thread->thread_local_storage[key];
 }
 
 /**

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h Thu Mar 29 08:51:49 2007
@@ -62,48 +62,13 @@
 // FS14_TLS_USE define turns on windows specific TLS access optimization 
 // We use free TIB slot with 14 offset, see following article for details 
 // http://www.microsoft.com/msj/archive/S2CE.aspx
-#define FS14_TLS_USE
+//#define FS14_TLS_USE
 #endif
 
-/*
-#ifdef _EM64T_
-#define APR_TLS_USE
-#endif
-*/
-
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
-// optimization code
-#if !defined (APR_TLS_USE ) && !defined (FS14_TLS_USE) 
 
-#ifdef PLATFORM_POSIX
-extern __thread hythread_t tm_self_tls;
-#else
-extern __declspec(thread) hythread_t tm_self_tls;
-#endif //PLATFORM_POSIX
-
-#else
-#if defined (WIN32) && defined (FS14_TLS_USE)
-
-__forceinline hythread_t tmn_self_macro() {
-    register hythread_t t;
-    _asm { mov eax, fs:[0x14]
-           mov t, eax;
-    }
-    return t;
-}
-
-
-#define store_tm_self(self)  (__asm(mov self, fs:[0x14]))
-#define tm_self_tls (tmn_self_macro())
-#endif 
-
-#endif
-
-#ifdef APR_TLS_USE
-#define tm_self_tls (hythread_self())
-#endif
 
 
 #ifdef __linux__
@@ -146,13 +111,9 @@
     void* reserved;
 #endif
 
-    /**
-     * Each thread keeps a pointer to the library it belongs to.
-     */
-    HyThreadLibrary * library;
+// Public fields exported by HyThread_public. If you change these fields,
+// please, check fields in hythread.h/HyThread_public
 
-// Suspension 
-    
     /**
      * Number of requests made for this thread, it includes both
      * suspend requests and safe point callback requests.
@@ -173,15 +134,6 @@
     int32 request;
 
     /**
-     * Number of suspend requests made for this thread.
-     * The field is modified by atomic operations.
-     *
-     * After increment/decrement of suspend_count, request field
-     * should be incremented/decremented too.
-     */
-    int32 suspend_count;
-    
-    /**
      * Field indicating that thread can safely be suspended.
      * Safe suspension is enabled on value 0.
      *
@@ -202,6 +154,40 @@
      * after exitting.
      */
     int16 disable_count;
+
+
+    /**
+     * Group for this thread. Different groups are needed in order 
+     * to be able to quickly iterate over the specific group.
+     * Examples are: Java threads, GC private threads.
+     * Equal to the address of the head of the list of threads for this group.
+     */
+    hythread_group_t  group; 
+
+    /**
+     * Array representing thread local storage
+     */
+    void *thread_local_storage[10];
+
+
+// Private fields
+
+    /**
+     * Each thread keeps a pointer to the library it belongs to.
+     */
+    HyThreadLibrary * library;
+
+// Suspension 
+    
+    /**
+     * Number of suspend requests made for this thread.
+     * The field is modified by atomic operations.
+     *
+     * After increment/decrement of suspend_count, request field
+     * should be incremented/decremented too.
+     */
+    int32 suspend_count;
+    
         
     /**
      * Function to be executed at safepoint upon thread resume.
@@ -220,14 +206,6 @@
     hysem_t resume_event;
 
 // Basic manipulation fields
-
-    /**
-     * Group for this thread. Different groups are needed in order 
-     * to be able to quickly iterate over the specific group.
-     * Examples are: Java threads, GC private threads.
-     * Equal to the address of the head of the list of threads for this group.
-     */
-    hythread_group_t  group; 
     
     /**
      * Points to the next thread within the group.
@@ -321,11 +299,6 @@
      * APR thread attributes
      */
     apr_threadattr_t *apr_attrs;
-
-    /**
-     * Array representing thread local storage
-     */
-    void *thread_local_storage[10];
 
     /**
      * Extension to the standard local storage slot.

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=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h Thu Mar 29 08:51:49 2007
@@ -34,7 +34,8 @@
 #include <apr_pools.h>
 
 #include "open/types.h"
-#include "open/hythread.h"
+//#include "open/hythread.h"
+#include <open/hythread_ext.h>
 #include "open/ti_thread.h"
 
 #include "vm_core_types.h"
@@ -46,7 +47,7 @@
 
 
 // 
-#define tmn_suspend_disable assert(hythread_is_suspend_enabled());hythread_suspend_disable 
+#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
@@ -173,14 +174,28 @@
 typedef  VM_thread *vm_thread_accessor();
 VMEXPORT extern vm_thread_accessor *get_thread_ptr;
 
-VMEXPORT VM_thread *get_vm_thread(hythread_t thr);
+//VMEXPORT VM_thread *get_vm_thread(hythread_t thr);
+//VMEXPORT VM_thread *get_vm_thread_self();
+
+inline VM_thread *get_vm_thread_fast_self() {
+	register hythread_t thr = hythread_self();
+
+    return (VM_thread *)hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY);
+}
+
+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);
+}
 
 VMEXPORT void init_TLS_data();
 
 VMEXPORT void set_TLS_data(VM_thread *thread) ;
 uint16 get_self_stack_key();
 
-#define p_TLS_vmthread (get_thread_ptr())
+#define p_TLS_vmthread (get_vm_thread_fast_self())
 
 Registers *thread_gc_get_context(VM_thread *, VmRegisterContext &);
 void thread_gc_set_context(VM_thread *);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp Thu Mar 29 08:51:49 2007
@@ -44,8 +44,10 @@
 #include <apr_pools.h>
 
 #include "open/hythread.h"
+#include "open/hythread_ext.h"
 #include "open/jthread.h"
 #include "open/thread_externals.h"
+
 #include "open/types.h"
 #include "open/vm_util.h"
 #include "open/gc.h"
@@ -212,14 +214,12 @@
     // mode until current thread is not attaced to VM.
     assert(hythread_is_suspend_enabled());
 
-    hythread_t hythread = hythread_self();
-
     if (p_vmt_dummies != NULL) {
 	// VMThread structure is already allocated, we only need to set
 	// TLS
 	set_TLS_data (p_vm_thread);
     } else {
-	p_vm_thread = get_vm_thread(hythread);
+	p_vm_thread = get_vm_thread(hythread_self());
 	
 	if (p_vm_thread != NULL) {
 	    assert (java_vm == p_vm_thread->jni_env->vm); 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp Thu Mar 29 08:51:49 2007
@@ -122,13 +122,6 @@
     }
     return p_vmthread;
 } 
-            
-VM_thread *get_vm_thread(hythread_t thr) {
-    if (thr == NULL) {
-        return NULL;
-    }
-    return (VM_thread *)hythread_tls_get(thr, TLS_key_pvmthread);
-}
 
 VM_thread *get_vm_thread_ptr_safe(JNIEnv *jenv, jobject jThreadObj)
 {
@@ -146,12 +139,8 @@
   
 vm_thread_accessor* get_thread_ptr = get_thread_ptr_stub;
 void init_TLS_data() {
-    hythread_tls_alloc(&TLS_key_pvmthread);
-#ifndef _EM64T_
-    get_thread_ptr = (vm_thread_accessor*) get_tls_helper(TLS_key_pvmthread);
-    //printf ("init fast call %p\n", get_thread_ptr);
-#endif
-
+    //printf ("init TLS data, TLS key = %x \n", TLS_key_pvmthread);
+    TLS_key_pvmthread = TM_THREAD_VM_TLS_KEY;
 }
   
 void set_TLS_data(VM_thread *thread) {

Modified: harmony/enhanced/drlvm/trunk/vm/vmi/src/vmi.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmi/src/vmi.cpp?view=diff&rev=523754&r1=523753&r2=523754
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmi/src/vmi.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmi/src/vmi.cpp Thu Mar 29 08:51:49 2007
@@ -20,10 +20,10 @@
  */  
 #include <assert.h>
 
+#include "open/hythread.h"
 
 #include "platform_lowlevel.h"
 #include "vm_trace.h"
-
 #include "zipsup.h"
 #include "environment.h"
 #include "properties.h"