[runtime] Cleanup usage of reflection_info_unregister_classes. Move it under the...
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 26 Nov 2013 23:28:14 +0000 (18:28 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 5 Dec 2013 19:11:56 +0000 (14:11 -0500)
mono/metadata/appdomain.c
mono/metadata/image.c
mono/metadata/metadata-internals.h
mono/metadata/reflection.c

index 4bcf6116ba5a0b046e8d600b7c0927e40ce16994..944be13c7966fffb6f5b05fb8016e4bc64b15bac 100644 (file)
@@ -2229,7 +2229,6 @@ deregister_reflection_info_roots_from_list (MonoImage *image)
                list = list->next;
        }
 
-       g_slist_free (image->reflection_info_unregister_classes);
        image->reflection_info_unregister_classes = NULL;
 }
 
index 9c2dff1dd05e3eae386bacf9eb2460ce8464dd93..d592cee701d3ccc2d1c84094f0cedd7ca43c18af 100644 (file)
@@ -1662,7 +1662,11 @@ mono_image_close_except_pools (MonoImage *image)
        if (image->property_hash)
                mono_property_hash_destroy (image->property_hash);
 
-       g_slist_free (image->reflection_info_unregister_classes);
+       /*
+       reflection_info_unregister_classes is only required by dynamic images, which will not be properly
+       cleared during shutdown as we don't perform regular appdomain unload for the root one.
+       */
+       g_assert (!image->reflection_info_unregister_classes || mono_runtime_is_shutting_down ());
        image->reflection_info_unregister_classes = NULL;
 
        if (image->interface_bitset) {
@@ -1707,12 +1711,6 @@ void
 mono_image_close_finish (MonoImage *image)
 {
        int i;
-       GSList *l;
-
-       for (l = image->reflection_info_unregister_classes; l; l = l->next)
-               g_free (l->data);
-       g_slist_free (image->reflection_info_unregister_classes);
-       image->reflection_info_unregister_classes = NULL;
 
        if (image->references && !image->dynamic) {
                for (i = 0; i < image->nreferences; i++) {
@@ -2360,3 +2358,12 @@ mono_image_property_remove (MonoImage *image, gpointer subject)
        mono_property_hash_remove_object (image->property_hash, subject);
        mono_image_unlock (image);
 }
+
+void
+mono_image_append_class_to_reflection_info_set (MonoClass *class)
+{
+       MonoImage *image = class->image;
+       mono_image_lock (image);
+       image->reflection_info_unregister_classes = g_slist_prepend_mempool (image->mempool, image->reflection_info_unregister_classes, class);
+       mono_image_unlock (image);
+}
index 7cbaa7c1b0d520547fc78aa5be302c296e1f97c6..497d77b12dcb3049215409ff5cb6e4b71abe1976 100644 (file)
@@ -572,6 +572,9 @@ mono_install_image_unload_hook (MonoImageUnloadFunc func, gpointer user_data) MO
 void
 mono_remove_image_unload_hook (MonoImageUnloadFunc func, gpointer user_data) MONO_INTERNAL;
 
+void
+mono_image_append_class_to_reflection_info_set (MonoClass *class) MONO_INTERNAL;
+
 gpointer
 mono_image_set_alloc  (MonoImageSet *set, guint size) MONO_INTERNAL;
 
index b5d08e1209257a409b6550ed08b3f46a50eb8a25..88bb0d38d14c3725dc689c36759433fdd06ef317 100644 (file)
@@ -9843,8 +9843,7 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
                if (!tb->nesting_type) {
                        mono_image_add_to_name_cache (klass->image, klass->name_space, klass->name, tb->table_idx);
                } else {
-                       klass->image->reflection_info_unregister_classes =
-                               g_slist_prepend (klass->image->reflection_info_unregister_classes, klass);
+                       mono_image_append_class_to_reflection_info_set (klass);
                }
        } else {
                g_assert (mono_class_get_ref_info (klass) == tb);
@@ -11458,9 +11457,7 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
        gparam->type.type = &pklass->byval_arg;
 
        mono_class_set_ref_info (pklass, gparam);
-       mono_image_lock (image);
-       image->reflection_info_unregister_classes = g_slist_prepend (image->reflection_info_unregister_classes, pklass);
-       mono_image_unlock (image);
+       mono_image_append_class_to_reflection_info_set (pklass);
 }
 
 MonoArray *