From 996a96124ed89337dfb888cbf391b085d8b0d026 Mon Sep 17 00:00:00 2001 From: Gonzalo Paniagua Javier Date: Thu, 23 Sep 2004 21:28:19 +0000 Subject: [PATCH] 2004-09-23 Gonzalo Paniagua Javier * appdomain.c: (mono_domain_set): allow setting a domain that is being unloaded. (mono_domain_unload): invoke the DomainUnload callbacks in the domain being unloaded. svn path=/branches/mono-1-0/mono/; revision=34320 --- mono/metadata/ChangeLog | 7 +++++++ mono/metadata/appdomain.c | 16 +++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 01280d3fe0a..f7b1cce8bab 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,10 @@ +2004-09-23 Gonzalo Paniagua Javier + + * appdomain.c: + (mono_domain_set): allow setting a domain that is being unloaded. + (mono_domain_unload): invoke the DomainUnload callbacks in the domain + being unloaded. + 2004-09-18 Martin Baulig * mono-debug.c, debug-mono-symfile.c: Merged my locking changes diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index 688265a1eec..c87e2b01bf2 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -252,12 +252,12 @@ mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb) * if it is being unloaded. * Returns: * - TRUE on success - * - FALSE if the domain is being unloaded + * - FALSE if the domain is unloaded */ gboolean mono_domain_set (MonoDomain *domain, gboolean force) { - if (!force && (domain->state == MONO_APPDOMAIN_UNLOADING || domain->state == MONO_APPDOMAIN_UNLOADED)) + if (!force && domain->state == MONO_APPDOMAIN_UNLOADED) return FALSE; mono_domain_set_internal (domain); @@ -1020,10 +1020,8 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoString *file, assembly = mono_assembly_open (filename, NULL); g_free (filename); - if (!assembly) { - mono_raise_exception ((MonoException *)mono_exception_from_name ( - mono_defaults.corlib, "System.IO", "FileNotFoundException")); - } + if (!assembly) + mono_raise_exception (mono_get_exception_file_not_found (filename)); image = assembly->image; @@ -1132,7 +1130,7 @@ ves_icall_System_AppDomain_InternalSetContext (MonoAppContext *mc) MONO_ARCH_SAVE_REGS; mono_context_set (mc); - + return old_context; } @@ -1235,6 +1233,7 @@ mono_domain_unload (MonoDomain *domain) MonoMethod *method; MonoObject *exc; unload_data thread_data; + MonoDomain *caller_domain = mono_domain_get (); /* printf ("UNLOAD STARTING FOR %s.\n", domain->friendly_name); */ @@ -1252,6 +1251,7 @@ mono_domain_unload (MonoDomain *domain) g_assert_not_reached (); } + mono_domain_set (domain, FALSE); /* Notify OnDomainUnload listeners */ method = look_for_method_by_name (domain->domain->mbr.obj.vtable->klass, "DoDomainUnload"); g_assert (method); @@ -1261,6 +1261,7 @@ mono_domain_unload (MonoDomain *domain) if (exc) { /* Roll back the state change */ domain->state = MONO_APPDOMAIN_CREATED; + mono_domain_set (caller_domain, FALSE); mono_raise_exception ((MonoException*)exc); } @@ -1287,6 +1288,7 @@ mono_domain_unload (MonoDomain *domain) ; /* wait for the thread */ + mono_domain_set (caller_domain, FALSE); if (thread_data.failure_reason) { MonoException *ex; -- 2.25.1