[runtime] Avoid using tls in the monitor wrappers if its not available.
authorZoltan Varga <vargaz@gmail.com>
Sun, 13 Jul 2014 17:07:25 +0000 (19:07 +0200)
committerZoltan Varga <vargaz@gmail.com>
Sun, 13 Jul 2014 17:07:25 +0000 (19:07 +0200)
mono/metadata/monitor.c
mono/metadata/object-internals.h
mono/mini/mini.c

index bab7d4da04554c0aaaaf543dff0ce3f6a89a581b..fc9814b33a1f4d9c51b38b05ca6aad8bcc18b71b 100644 (file)
@@ -878,7 +878,6 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        static MonoMethod *compare_exchange_method;
        int obj_null_branch, true_locktaken_branch = 0, syncp_null_branch, has_owner_branch, other_owner_branch, tid_branch, thin_hash_branch;
        int tid_loc, syncp_loc, owner_loc;
-       int thread_tls_offset;
        gboolean is_v4 = mono_method_signature (monitor_enter_method)->param_count == 2;
        int fast_path_idx = is_v4 ? FASTPATH_ENTERV4 : FASTPATH_ENTER;
        WrapperInfo *info;
@@ -886,13 +885,12 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        /* The !is_v4 version is not used/tested */
        g_assert (is_v4);
 
-       thread_tls_offset = mono_thread_get_tls_offset ();
-       if (thread_tls_offset == -1)
-               return NULL;
-
        if (monitor_il_fastpaths [fast_path_idx])
                return monitor_il_fastpaths [fast_path_idx];
 
+       if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD))
+               return NULL;
+
        if (!compare_exchange_method) {
                MonoMethodDesc *desc;
                MonoClass *class;
@@ -1050,17 +1048,15 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        MonoMethodBuilder *mb;
        MonoMethod *res;
        int obj_null_branch, has_waiting_branch, has_syncp_branch, owned_branch, nested_branch, thin_hash_branch;
-       int thread_tls_offset;
        int syncp_loc;
        WrapperInfo *info;
 
-       thread_tls_offset = mono_thread_get_tls_offset ();
-       if (thread_tls_offset == -1)
-               return NULL;
-
        if (monitor_il_fastpaths [FASTPATH_EXIT])
                return monitor_il_fastpaths [FASTPATH_EXIT];
 
+       if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD))
+               return NULL;
+
        mb = mono_mb_new (mono_defaults.monitor_class, "FastMonitorExit", MONO_WRAPPER_UNKNOWN);
 
        mb->method->slot = -1;
index eea738a1e7c502955eae208415d6347e62b21950..9ec3893765a22731c39b454ae05c7497d5a1dfa7 100644 (file)
@@ -596,6 +596,7 @@ typedef struct {
        void     (*set_cast_details) (MonoClass *from, MonoClass *to);
        void     (*debug_log) (int level, MonoString *category, MonoString *message);
        gboolean (*debug_log_is_enabled) (void);
+       gboolean (*tls_key_supported) (MonoTlsKey key);
 } MonoRuntimeCallbacks;
 
 typedef gboolean (*MonoInternalStackWalk) (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data);
index 3459217ea4329f85c5b14b429f81f27da4db9202..b35efa5dd02879334a964acf423ca5a26e57e427 100644 (file)
@@ -3013,6 +3013,15 @@ mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key)
                return mini_get_tls_offset (key) != -1;
 }
 
+static gboolean
+mini_tls_key_supported (MonoTlsKey key)
+{
+       if (!MONO_ARCH_HAVE_TLS_GET)
+               return FALSE;
+
+       return mini_get_tls_offset (key) != -1;
+}
+
 MonoInst*
 mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key)
 {
@@ -7266,6 +7275,7 @@ mini_init (const char *filename, const char *runtime_version)
        callbacks.set_cast_details = mono_set_cast_details;
        callbacks.debug_log = mono_debugger_agent_debug_log;
        callbacks.debug_log_is_enabled = mono_debugger_agent_debug_log_is_enabled;
+       callbacks.tls_key_supported = mini_tls_key_supported;
 
        if (mono_use_imt) {
                callbacks.get_vtable_trampoline = mini_get_vtable_trampoline;