+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
* 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);
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;
MONO_ARCH_SAVE_REGS;
mono_context_set (mc);
-
+
return old_context;
}
MonoMethod *method;
MonoObject *exc;
unload_data thread_data;
+ MonoDomain *caller_domain = mono_domain_get ();
/* printf ("UNLOAD STARTING FOR %s.\n", domain->friendly_name); */
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);
if (exc) {
/* Roll back the state change */
domain->state = MONO_APPDOMAIN_CREATED;
+ mono_domain_set (caller_domain, FALSE);
mono_raise_exception ((MonoException*)exc);
}
; /* wait for the thread */
+ mono_domain_set (caller_domain, FALSE);
if (thread_data.failure_reason) {
MonoException *ex;