2004-09-23 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 23 Sep 2004 21:28:19 +0000 (21:28 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 23 Sep 2004 21:28:19 +0000 (21:28 -0000)
* 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
mono/metadata/appdomain.c

index 01280d3fe0a33f508d2109123a88e721641a00f3..f7b1cce8bab258546fdc2fdfea92c987d6f2804f 100644 (file)
@@ -1,3 +1,10 @@
+2004-09-23 Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * 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  <martin@ximian.com>
 
        * mono-debug.c, debug-mono-symfile.c: Merged my locking changes
index 688265a1eec83f3c127e66e9dff6aeda2d058f53..c87e2b01bf2ae5f8e31805bc04365aa610833316 100644 (file)
@@ -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;