Clear unloaded types on appdomain unload.
authorZoltan Varga <vargaz@gmail.com>
Thu, 10 Jun 2010 03:13:18 +0000 (03:13 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 10 Jun 2010 03:13:18 +0000 (03:13 -0000)
svn path=/trunk/mono/; revision=158759

mono/mini/ChangeLog
mono/mini/debugger-agent.c

index 821cc8f057c978e03229a5d14c4b1f775dfb0d05..bb8014cec61c6b20097e63a0fdc6799e6ed13991 100755 (executable)
@@ -1,3 +1,7 @@
+2010-06-09  Levi Bard  <levi@unity3d.com>
+
+       * debugger-agent.c: Clear unloaded types on appdomain unload.
+
 2010-06-08  Zoltan Varga  <vargaz@gmail.com>
 
        * liveness.c (visit_bb): Make the component vregs of long vars volatile as well.
index 2c4d3009537a04a76a825b7ff65c30a89eb921e8..3fec602382fa878b2690d46ce8ff2a6a09d34e97 100644 (file)
@@ -70,6 +70,7 @@ int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
 #include <mono/metadata/gc-internal.h>
 #include <mono/metadata/threads-types.h>
 #include <mono/metadata/socket-io.h>
+#include <mono/metadata/assembly.h>
 #include <mono/utils/mono-semaphore.h>
 #include "debugger-agent.h"
 #include "mini.h"
@@ -613,6 +614,8 @@ static void clear_event_requests_for_assembly (MonoAssembly *assembly);
 
 static void clear_breakpoints_for_domain (MonoDomain *domain);
 
+static void clear_types_for_assembly (MonoAssembly *assembly);
+
 /* Submodule init/cleanup */
 static void breakpoints_init (void);
 static void breakpoints_cleanup (void);
@@ -2941,6 +2944,7 @@ assembly_unload (MonoProfiler *prof, MonoAssembly *assembly)
        process_profiler_event (EVENT_KIND_ASSEMBLY_UNLOAD, assembly);
 
        clear_event_requests_for_assembly (assembly);
+       clear_types_for_assembly (assembly);
 }
 
 static void
@@ -4587,6 +4591,30 @@ clear_event_requests_for_assembly (MonoAssembly *assembly)
        mono_loader_unlock ();
 }
 
+/*
+ * type_comes_from_assembly:
+ *
+ *   GHRFunc that returns TRUE if klass comes from assembly
+ */
+static gboolean
+type_comes_from_assembly (gpointer klass, gpointer also_klass, gpointer assembly)
+{
+       return (mono_class_get_image ((MonoClass*)klass) == mono_assembly_get_image ((MonoAssembly*)assembly));
+}
+
+/*
+ * clear_types_for_assembly:
+ *
+ *   Clears types from loaded_classes for a given assembly
+ */
+static void
+clear_types_for_assembly (MonoAssembly *assembly)
+{
+       mono_loader_lock ();
+       g_hash_table_foreach_remove (loaded_classes, type_comes_from_assembly, assembly);
+       mono_loader_unlock ();
+}
+
 static void
 add_thread (gpointer key, gpointer value, gpointer user_data)
 {