[corlib] Clean up thread execution context
authorMarek Safar <marek.safar@gmail.com>
Tue, 26 May 2015 15:41:32 +0000 (17:41 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 26 May 2015 15:42:27 +0000 (17:42 +0200)
external/referencesource
mcs/class/corlib/System.Threading/Thread.cs
mcs/class/corlib/System/Environment.cs
mono/metadata/appdomain.c
mono/metadata/object-internals.h
mono/metadata/object.c
mono/metadata/threads-types.h
mono/metadata/threads.c

index d73f31d72043a17d0e66ba3ee6f833aa020617b4..9fffd07ae09043d3385196659eb75429b976cdf3 160000 (submodule)
@@ -1 +1 @@
-Subproject commit d73f31d72043a17d0e66ba3ee6f833aa020617b4
+Subproject commit 9fffd07ae09043d3385196659eb75429b976cdf3
index a27384d1c2b3e24b7af323fe47db34b42413715d..a1737c935587043afccb839ef16de4424ebcdd61 100644 (file)
@@ -116,7 +116,6 @@ namespace System.Threading {
                #region Sync with metadata/object-internals.h
                private InternalThread internal_thread;
                object m_ThreadStartArg;
-               private ExecutionContext ec_to_set;
                #endregion
 #pragma warning restore 414
 
@@ -127,18 +126,12 @@ namespace System.Threading {
                CultureInfo current_culture;
                CultureInfo current_ui_culture;
 
-               // the name of current_thread and _ec is
+               // the name of current_thread is
                // important because they are used by the runtime.
 
                [ThreadStatic]
                static Thread current_thread;
 
-               /* The actual ExecutionContext of the thread.  It's
-                  ThreadStatic so that it's not shared between
-                  AppDomains. */
-               [ThreadStatic]
-               static ExecutionContext _ec;
-
                static internal CultureInfo default_culture;
                static internal CultureInfo default_ui_culture;
 
@@ -322,13 +315,6 @@ namespace System.Threading {
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private extern IntPtr Thread_internal (MulticastDelegate start);
 
-               public Thread(ThreadStart start) {
-                       if(start==null) {
-                               throw new ArgumentNullException("Null ThreadStart");
-                       }
-                       m_Delegate=start;
-               }
-
                private Thread (InternalThread it) {
                        internal_thread = it;
                }
@@ -518,49 +504,16 @@ namespace System.Threading {
                        }
                }
 
-               static internal ContextCallback _ccb = new ContextCallback(ThreadStart_Context);
-
-               static private void ThreadStart_Context(Object state)
-               {
-                       var t = (Thread)state;
-                       if (t.m_Delegate is ThreadStart)
-                       {
-                               ((ThreadStart)t.m_Delegate)();
-                       }
-                       else
-                       {
-                               ((ParameterizedThreadStart)t.m_Delegate)(t.m_ThreadStartArg);
-                       }
-               }
-
-               private void StartInternal ()
+               void StartInternal (IPrincipal principal, ref StackCrawlMark stackMark)
                {
-                       current_thread = this;
-
-                       if (_ec != null) {
-                               ExecutionContext.Run (_ec, _ccb, (Object)this);
-                               return;
-                       }
-
-                       if (m_Delegate is ThreadStart) {
-                               ((ThreadStart) m_Delegate) ();
-                       } else {
-                               ((ParameterizedThreadStart) m_Delegate) (m_ThreadStartArg);
-                       }
-               }
-
-               public void Start() {
-                       StackCrawlMark stackMark = default (StackCrawlMark);
-                       // TODO: Use SetExecutionContextHelper to remove 2 of 3 levels of indirections
-                       ec_to_set = ExecutionContext.Capture (ref stackMark, ExecutionContext.CaptureOptions.IgnoreSyncCtx);
-
                        Internal._serialized_principal = CurrentThread.Internal._serialized_principal;
 
                        // Thread_internal creates and starts the new thread, 
-                       if (Thread_internal((ThreadStart) StartInternal) == (IntPtr) 0)
+                       if (Thread_internal(m_Delegate) == IntPtr.Zero)
                                throw new SystemException ("Thread creation failed.");
-               }
 
+                       m_ThreadStartArg = null;
+               }
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                extern private static void SetState (InternalThread thread, ThreadState set);
@@ -664,6 +617,9 @@ namespace System.Threading {
 
                static int GetProcessDefaultStackSize (int maxStackSize)
                {
+                       if (maxStackSize == 0)
+                               return 0;
+
                        if (maxStackSize < 131072) // make sure stack is at least 128k big
                                return 131072;
 
@@ -744,12 +700,6 @@ namespace System.Threading {
                        return ManagedThreadId;
                }
 
-               public void Start (object parameter)
-               {
-                       m_ThreadStartArg = parameter;
-                       Start ();
-               }
-
                internal CultureInfo GetCurrentUICultureNoAppX ()
                {
                        return CultureInfo.CurrentUICulture;
index eebd305586778e6bf6912799c992513cabeb7086..97642c44dedef3edaa2397b3eec0dc2c07315703 100644 (file)
@@ -57,7 +57,7 @@ namespace System {
                 * of icalls, do not require an increment.
                 */
 #pragma warning disable 169
-               private const int mono_corlib_version = 133;
+               private const int mono_corlib_version = 134;
 #pragma warning restore 169
 
                [ComVisible (true)]
index 00f32f930b2fb2038164a8742cbf5faaa8b0b7b6..b3742cb943fceff38b5601b7ae8662ff2c7f2c63 100644 (file)
@@ -78,7 +78,7 @@
  * Changes which are already detected at runtime, like the addition
  * of icalls, do not require an increment.
  */
-#define MONO_CORLIB_VERSION 133
+#define MONO_CORLIB_VERSION 134
 
 typedef struct
 {
index 05c563bad344be1e286755c3c185f5af1f9513a3..15482c9771dfa19b8570bcbf8fa8bacf15c5c015 100644 (file)
@@ -431,7 +431,6 @@ struct _MonoThread {
        MonoObject obj;
        struct _MonoInternalThread *internal_thread;
        MonoObject *start_obj;
-       MonoObject *ec_to_set;
 };
 
 typedef struct {
index 5aea823b48b27b068991d15c1b7b1200b2cf0d83..b326bd84233b7374aa73b2c3a541a1c591465439 100644 (file)
@@ -5803,14 +5803,6 @@ mono_async_result_invoke (MonoAsyncResult *ares, MonoObject **exc)
 
        thread = mono_thread_internal_current ();
 
-       if (!ares->execution_context) {
-               ares->original_context = NULL;
-       } else {
-               /* use captured ExecutionContext (if available) */
-               MONO_OBJECT_SETREF (ares, original_context, mono_thread_get_execution_context ());
-               mono_thread_set_execution_context (ares->execution_context);
-       }
-
        ac = (MonoAsyncCall*) ares->object_data;
        if (!ac) {
                thread->async_invoke_method = ((MonoDelegate*) ares->async_delegate)->method;
@@ -5844,12 +5836,6 @@ mono_async_result_invoke (MonoAsyncResult *ares, MonoObject **exc)
                }
        }
 
-       /* restore original thread execution context if flow isn't suppressed, i.e. non null */
-       if (ares->original_context) {
-               mono_thread_set_execution_context (ares->original_context);
-               ares->original_context = NULL;
-       }
-
        return res;
 }
 
index 153b2ea3f5be5ebf2424c051f7c35b4f254d9c0f..ac0f482767db24ad6a820d8e69716f021c97be1e 100644 (file)
@@ -216,9 +216,6 @@ void mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *na
 
 void mono_threads_install_notify_pending_exc (MonoThreadNotifyPendingExcFunc func);
 
-MonoObject* mono_thread_get_execution_context (void);
-void mono_thread_set_execution_context (MonoObject *ec);
-
 void mono_runtime_set_has_tls_get (gboolean val);
 gboolean mono_runtime_has_tls_get (void);
 
index 0a35cf71df4a6b667cc803a7a4d5c4cd6d6e10b9..5479f53c9ffbd61115a48e46204943fb2e84f71e 100644 (file)
@@ -702,9 +702,6 @@ static guint32 WINAPI start_wrapper_internal(void *data)
        mono_g_hash_table_remove (thread_start_args, start_info->obj);
        mono_threads_unlock ();
 
-       mono_thread_set_execution_context (start_info->obj->ec_to_set);
-       start_info->obj->ec_to_set = NULL;
-
        g_free (start_info);
        THREAD_DEBUG (g_message ("%s: start_wrapper for %"G_GSIZE_FORMAT, __func__,
                                                         internal->tid));
@@ -4331,43 +4328,6 @@ mono_thread_test_state (MonoInternalThread *thread, MonoThreadState test)
        return ret;
 }
 
-//static MonoClassField *execution_context_field;
-
-static MonoObject**
-get_execution_context_addr (void)
-{
-       MonoDomain *domain = mono_domain_get ();
-       guint32 offset = domain->execution_context_field_offset;
-
-       if (!offset) {
-               MonoClassField *field = mono_class_get_field_from_name (mono_defaults.thread_class, "_ec");
-               g_assert (field);
-
-               g_assert (mono_class_try_get_vtable (domain, mono_defaults.appdomain_class));
-
-               mono_domain_lock (domain);
-               offset = GPOINTER_TO_UINT (g_hash_table_lookup (domain->special_static_fields, field));
-               mono_domain_unlock (domain);
-               g_assert (offset);
-
-               domain->execution_context_field_offset = offset;
-       }
-
-       return (MonoObject**) mono_get_special_static_data (offset);
-}
-
-MonoObject*
-mono_thread_get_execution_context (void)
-{
-       return *get_execution_context_addr ();
-}
-
-void
-mono_thread_set_execution_context (MonoObject *ec)
-{
-       *get_execution_context_addr () = ec;
-}
-
 static gboolean has_tls_get = FALSE;
 
 void