[bcl] Implement Thread.CurrentThread using an icall which calls mono_… (#4011)
authorZoltan Varga <vargaz@gmail.com>
Wed, 23 Nov 2016 19:43:47 +0000 (14:43 -0500)
committerGitHub <noreply@github.com>
Wed, 23 Nov 2016 19:43:47 +0000 (14:43 -0500)
* [bcl] Implement Thread.CurrentThread using an icall which calls mono_thread_current () to avoid creating duplicate Thread objects.

* [bcl] Remove unused Thread:CurrentInternalThread_internal () icall.

* [bcl] Optimize Thread:CurrentThread a bit.

mcs/class/corlib/System.Threading/Thread.cs
mono/metadata/icall-def.h
mono/metadata/threads-types.h
mono/metadata/threads.c

index 4bce5168e7dea5288ecff37ad405bab3e929c66b..cff4be677ba3db6e837d166ac1431c81cfb09dec 100644 (file)
@@ -288,17 +288,17 @@ namespace System.Threading {
                        }
                }
 
-               // Looks up the object associated with the current thread
-               // this is called by the JIT directly, too
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static InternalThread CurrentInternalThread_internal();
+               private extern static Thread GetCurrentThread ();
 
                public static Thread CurrentThread {
                        [ReliabilityContract (Consistency.WillNotCorruptState, Cer.MayFail)]
                        get {
-                               if (current_thread == null)
-                                       current_thread = new Thread (CurrentInternalThread_internal ());
-                               return current_thread;
+                               Thread current = current_thread;
+                               if (current != null)
+                                       return current;
+                               // This will set the current_thread tls variable
+                               return GetCurrentThread ();
                        }
                }
 
index 65af782ea3da35df1040728687944ee644e911a1..7b6d6cd0f0e79d684089ac1f74ddffead341ad58 100644 (file)
@@ -933,8 +933,8 @@ ICALL(THREAD_1a, "ByteArrayToCurrentDomain(byte[])", ves_icall_System_Threading_
 ICALL(THREAD_1b, "ByteArrayToRootDomain(byte[])", ves_icall_System_Threading_Thread_ByteArrayToRootDomain)
 ICALL(THREAD_2, "ClrState(System.Threading.InternalThread,System.Threading.ThreadState)", ves_icall_System_Threading_Thread_ClrState)
 ICALL(THREAD_2a, "ConstructInternalThread", ves_icall_System_Threading_Thread_ConstructInternalThread)
-ICALL(THREAD_3, "CurrentInternalThread_internal", mono_thread_internal_current)
 ICALL(THREAD_55, "GetAbortExceptionState", ves_icall_System_Threading_Thread_GetAbortExceptionState)
+ICALL(THREAD_60, "GetCurrentThread", ves_icall_System_Threading_Thread_GetCurrentThread)
 ICALL(THREAD_7, "GetDomainID", ves_icall_System_Threading_Thread_GetDomainID)
 ICALL(THREAD_8, "GetName_internal(System.Threading.InternalThread)", ves_icall_System_Threading_Thread_GetName_internal)
 ICALL(THREAD_57, "GetPriorityNative", ves_icall_System_Threading_Thread_GetPriority)
index 84f2c15e98fc5e19d14ad4990b018da5766fb9e6..3f2bd1d7befad7d5e9cdd868cec1dfa68c0b235e 100644 (file)
@@ -83,6 +83,7 @@ MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentCulture (MonoInter
 void ves_icall_System_Threading_Thread_SetCachedCurrentCulture (MonoThread *this_obj, MonoObject *culture);
 MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentUICulture (MonoInternalThread *this_obj);
 void ves_icall_System_Threading_Thread_SetCachedCurrentUICulture (MonoThread *this_obj, MonoObject *culture);
+MonoThread *ves_icall_System_Threading_Thread_GetCurrentThread (void);
 
 gint32 ves_icall_System_Threading_WaitHandle_WaitAll_internal(MonoArray *mono_handles, gint32 ms);
 gint32 ves_icall_System_Threading_WaitHandle_WaitAny_internal(MonoArray *mono_handles, gint32 ms);
index dd0e6dc89e18b7f288745d40635ed4963baf9b49..de2d69a375a8c160ef1f69f1a8b271bb4a9527f9 100644 (file)
@@ -1216,6 +1216,12 @@ ves_icall_System_Threading_Thread_ConstructInternalThread (MonoThread *this_obj)
        InterlockedCompareExchangePointer ((volatile gpointer *)&this_obj->internal_thread, internal, NULL);
 }
 
+MonoThread *
+ves_icall_System_Threading_Thread_GetCurrentThread (void)
+{
+       return mono_thread_current ();
+}
+
 HANDLE
 ves_icall_System_Threading_Thread_Thread_internal (MonoThread *this_obj,
                                                                                                   MonoObject *start)