Przeglądaj źródła

[corlib] Clean up thread execution context

Marek Safar 10 lat temu
rodzic
commit
cf766c92a7

+ 1 - 1
external/referencesource

@@ -1 +1 @@
-Subproject commit d73f31d72043a17d0e66ba3ee6f833aa020617b4
+Subproject commit 9fffd07ae09043d3385196659eb75429b976cdf3

+ 8 - 58
mcs/class/corlib/System.Threading/Thread.cs

@@ -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;

+ 1 - 1
mcs/class/corlib/System/Environment.cs

@@ -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)]

+ 1 - 1
mono/metadata/appdomain.c

@@ -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
 {

+ 0 - 1
mono/metadata/object-internals.h

@@ -431,7 +431,6 @@ struct _MonoThread {
 	MonoObject obj;
 	struct _MonoInternalThread *internal_thread;
 	MonoObject *start_obj;
-	MonoObject *ec_to_set;
 };
 
 typedef struct {

+ 0 - 14
mono/metadata/object.c

@@ -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;
 }
 

+ 0 - 3
mono/metadata/threads-types.h

@@ -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);
 

+ 0 - 40
mono/metadata/threads.c

@@ -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