X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fappdomain.c;h=0f11375d9f5007e7d6d80fe8ae993806d9178c6a;hb=595ebeeaef63a429632dd79e128f54c3902681e1;hp=e7a0db8eb2afaa66d4a204087fd839d4f7f49421;hpb=f41e857d3fef58b944e1523f0ee9a97b4f142468;p=mono.git diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index e7a0db8eb2a..0f11375d9f5 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -9,6 +9,7 @@ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2009 Novell, Inc (http://www.novell.com) * Copyright 2012 Xamarin Inc + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #undef ASSEMBLY_LOAD_DEBUG #include @@ -80,7 +81,7 @@ * Changes which are already detected at runtime, like the addition * of icalls, do not require an increment. */ -#define MONO_CORLIB_VERSION 143 +#define MONO_CORLIB_VERSION 146 typedef struct { @@ -319,7 +320,7 @@ mono_get_corlib_version (void) if (! (field->type->attrs & FIELD_ATTRIBUTE_STATIC)) return -1; value = mono_field_get_value_object_checked (mono_domain_get (), field, NULL, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + mono_error_assert_ok (&error); return *(gint32*)((gchar*)value + sizeof (MonoObject)); } @@ -434,13 +435,18 @@ mono_domain_create_appdomain (char *friendly_name, char *configuration_file) klass = mono_class_load_from_name (mono_defaults.corlib, "System", "AppDomainSetup"); setup = (MonoAppDomainSetup *) mono_object_new_checked (mono_domain_get (), klass, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + if (!is_ok (&error)) + goto fail; setup->configuration_file = configuration_file != NULL ? mono_string_new (mono_domain_get (), configuration_file) : NULL; ad = mono_domain_create_appdomain_internal (friendly_name, setup, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + if (!is_ok (&error)) + goto fail; return mono_domain_from_appdomain (ad); +fail: + mono_error_cleanup (&error); + return NULL; } /** @@ -937,23 +943,20 @@ mono_domain_set_options_from_config (MonoDomain *domain) MonoAppDomain * ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomainSetup *setup) { + MonoError error; + MonoAppDomain *ad = NULL; #ifdef DISABLE_APPDOMAINS - mono_set_pending_exception (mono_get_exception_not_supported ("AppDomain creation is not supported on this runtime.")); - return NULL; + mono_error_set_not_supported (&error, "AppDomain creation is not supported on this runtime."); #else - MonoError error; char *fname; - MonoAppDomain *ad; fname = mono_string_to_utf8 (friendly_name); ad = mono_domain_create_appdomain_internal (fname, setup, &error); g_free (fname); - - mono_error_raise_exception (&error); - - return ad; #endif + mono_error_set_pending_exception (&error); + return ad; } MonoArray * @@ -986,7 +989,9 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly } mono_domain_assemblies_unlock (domain); - res = mono_array_new (domain, mono_class_get_assembly_class (), assemblies->len); + res = mono_array_new_checked (domain, mono_class_get_assembly_class (), assemblies->len, &error); + if (!is_ok (&error)) + goto leave; for (i = 0; i < assemblies->len; ++i) { ass = (MonoAssembly *)g_ptr_array_index (assemblies, i); MonoReflectionAssembly *ass_obj = mono_assembly_get_object_checked (domain, ass, &error); @@ -1056,18 +1061,13 @@ mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *req /* FIXME: We invoke managed code here, so there is a potential for deadlocks */ str = mono_string_new (domain, aname_str); + g_free (aname_str); if (!str) { - g_free (aname_str); return NULL; } assembly = mono_try_assembly_resolve (domain, str, requesting, refonly, &error); - if (!mono_error_ok (&error)) { - g_free (aname_str); - mono_error_raise_exception (&error); /* FIXME don't raise here */ - } - - g_free (aname_str); + mono_error_cleanup (&error); if (assembly) return assembly->assembly; @@ -1162,7 +1162,7 @@ mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data) *params = ref_assembly; mono_runtime_invoke_checked (assembly_load_method, domain->domain, params, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + mono_error_cleanup (&error); } /* @@ -2208,8 +2208,10 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, if (!method) g_error ("No entry point method found in %s due to %s", image->name, mono_error_get_message (&error)); - if (!args) - args = (MonoArray *) mono_array_new (ad->data, mono_defaults.string_class, 0); + if (!args) { + args = (MonoArray *) mono_array_new_checked (ad->data, mono_defaults.string_class, 0, &error); + mono_error_assert_ok (&error); + } return mono_runtime_exec_main (method, (MonoArray *)args, NULL); } @@ -2308,7 +2310,7 @@ ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid) MonoError error; MonoString *res = NULL; res = mono_string_new_utf16_checked (mono_domain_get (), process_guid, sizeof(process_guid)/2, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } memcpy (process_guid, mono_string_chars(newguid), sizeof(process_guid)); @@ -2429,7 +2431,17 @@ unload_thread_main (void *arg) /* Have to attach to the runtime so shutdown can wait for this thread */ /* Force it to be attached to avoid racing during shutdown. */ thread = mono_thread_attach_full (mono_get_root_domain (), TRUE, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + if (!is_ok (&error)) { + data->failure_reason = g_strdup (mono_error_get_message (&error)); + mono_error_cleanup (&error); + goto failure; + } + mono_thread_set_name_internal (thread->internal_thread, mono_string_new (mono_get_root_domain (), "Domain unloader"), TRUE, &error); + if (!is_ok (&error)) { + data->failure_reason = g_strdup (mono_error_get_message (&error)); + mono_error_cleanup (&error); + goto failure; + } /* * FIXME: Abort our parent thread last, so we can return a failure @@ -2561,7 +2573,6 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc) unload_data *thread_data; MonoNativeThreadId tid; MonoDomain *caller_domain = mono_domain_get (); - char *name; /* printf ("UNLOAD STARTING FOR %s (%p) IN THREAD 0x%x.\n", domain->friendly_name, domain, mono_native_thread_id_get ()); */ @@ -2621,10 +2632,7 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc) thread_handle = mono_threads_create_thread ((LPTHREAD_START_ROUTINE)unload_thread_main, thread_data, 0, CREATE_SUSPENDED, &tid); if (thread_handle == NULL) return; - name = g_strdup_printf ("Unload thread for domain %x", domain); - mono_thread_info_set_name (tid, name); mono_thread_info_resume (tid); - g_free (name); /* Wait for the thread */ while (!thread_data->done && guarded_wait (thread_handle, INFINITE, TRUE) == WAIT_IO_COMPLETION) {