Wed Aug 29 18:37:37 CEST 2007 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / image.c
index 735ef6cdd9bf5a8364ffe7e2ca4f8191299029e6..ecd8a81f5083af8e640f5512c3c183c8b6c76375 100644 (file)
@@ -27,6 +27,7 @@
 #include <mono/utils/mono-logger.h>
 #include <mono/utils/mono-path.h>
 #include <mono/metadata/class-internals.h>
+#include <mono/metadata/assembly.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifdef HAVE_UNISTD_H
@@ -1101,7 +1102,26 @@ mono_image_close (MonoImage *image)
                return;
 
        mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading image %s [%p].", image->name, image);
-       
+
+       mono_metadata_clean_for_image (image);
+
+       /*
+        * The caches inside a MonoImage might refer to metadata which is stored in referenced 
+        * assemblies, so we can't release these references in mono_assembly_close () since the
+        * MonoImage might outlive its associated MonoAssembly.
+        */
+       if (image->references) {
+               int i;
+
+               for (i = 0; image->references [i]; i++) {
+                       if (image->references [i])
+                               mono_assembly_close (image->references [i]);
+               }
+
+               g_free (image->references);
+               image->references = NULL;
+       }
+
        mono_images_lock ();
        loaded_images = image->ref_only ? loaded_images_refonly_hash : loaded_images_hash;
        loaded_images_guid = image->ref_only ? loaded_images_refonly_guid_hash : loaded_images_guid_hash;
@@ -1213,6 +1233,8 @@ mono_image_close (MonoImage *image)
        }
        if (image->modules)
                g_free (image->modules);
+       if (image->modules_loaded)
+               g_free (image->modules_loaded);
        if (image->references)
                g_free (image->references);
        /*g_print ("destroy image %p (dynamic: %d)\n", image, image->dynamic);*/