* 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
{
mono_mutex_t mono_delegate_section;
-mono_mutex_t mono_strtod_mutex;
-
static gunichar2 process_guid [36];
static gboolean process_guid_set = FALSE;
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 ();
/* 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
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;
}
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
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 */