Merge pull request #1857 from slluis/fix-assembly-resolver
[mono.git] / mono / metadata / appdomain.c
index d3441ba140ff778c3a97a600427c2c4fb4838ad4..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 129
+#define MONO_CORLIB_VERSION 134
 
 typedef struct
 {
@@ -90,8 +90,6 @@ typedef struct
 
 mono_mutex_t mono_delegate_section;
 
-mono_mutex_t mono_strtod_mutex;
-
 static gunichar2 process_guid [36];
 static gboolean process_guid_set = FALSE;
 
@@ -258,12 +256,8 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
        domain->setup = setup;
 
        mono_mutex_init_recursive (&mono_delegate_section);
-
-       mono_mutex_init_recursive (&mono_strtod_mutex);
        
        mono_thread_attach (domain);
-       mono_context_init (domain);
-       mono_context_set (domain->default_context);
 
        mono_type_initialization_init ();
 
@@ -273,6 +267,10 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
        /* GC init has to happen after thread init */
        mono_gc_init ();
 
+       /* contexts use GC handles, so they must be initialized after the GC */
+       mono_context_init (domain);
+       mono_context_set (domain->default_context);
+
 #ifndef DISABLE_SOCKETS
        mono_network_init ();
 #endif
@@ -340,6 +338,7 @@ mono_context_init (MonoDomain *domain)
        context = (MonoAppContext *) mono_object_new_pinned (domain, class);
        context->domain_id = domain->domain_id;
        context->context_id = 0;
+       ves_icall_System_Runtime_Remoting_Contexts_Context_RegisterContext (context);
        domain->default_context = context;
 }
 
@@ -2360,6 +2359,18 @@ mono_domain_unload (MonoDomain *domain)
                mono_raise_exception ((MonoException*)exc);
 }
 
+static guint32
+guarded_wait (HANDLE handle, guint32 timeout, gboolean alertable)
+{
+       guint32 result;
+
+       MONO_PREPARE_BLOCKING
+       result = WaitForSingleObjectEx (handle, timeout, alertable);
+       MONO_FINISH_BLOCKING
+
+       return result;
+}
+
 /*
  * mono_domain_unload:
  * @domain: The domain to unload
@@ -2446,7 +2457,7 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
        g_free (name);
 
        /* Wait for the thread */       
-       while (!thread_data->done && WaitForSingleObjectEx (thread_handle, INFINITE, TRUE) == WAIT_IO_COMPLETION) {
+       while (!thread_data->done && guarded_wait (thread_handle, INFINITE, TRUE) == WAIT_IO_COMPLETION) {
                if (mono_thread_internal_has_appdomain_ref (mono_thread_internal_current (), domain) && (mono_thread_interruption_requested ())) {
                        /* The unload thread tries to abort us */
                        /* The icall wrapper will execute the abort */