Cleanup generic sharing data structures correctly.
authorZoltan Varga <vargaz@gmail.com>
Fri, 20 Aug 2010 12:16:28 +0000 (14:16 +0200)
committerZoltan Varga <vargaz@gmail.com>
Fri, 20 Aug 2010 12:16:28 +0000 (14:16 +0200)
mono/mini/mini-generic-sharing.c
mono/mini/mini.c
mono/mini/mini.h

index 8f378285da1b76ddd130e917d1fd207a99c85b07..28a472bfc72d89302e1d58657088e176d6295143 100644 (file)
@@ -236,12 +236,6 @@ register_generic_subclass (MonoClass *class)
        MonoClass *parent = class->parent;
        MonoClass *subclass;
        MonoRuntimeGenericContextTemplate *rgctx_template = class_lookup_rgctx_template (class);
-       static gboolean hook_installed;
-
-       if (!hook_installed) {
-               mono_install_image_unload_hook (mono_class_unregister_image_generic_subclasses, NULL);
-               hook_installed = TRUE;
-       }
 
        g_assert (rgctx_template);
 
@@ -1858,4 +1852,14 @@ mini_type_stack_size_full (MonoGenericSharingContext *gsctx, MonoType *t, guint3
 void
 mono_generic_sharing_init (void)
 {
+       mono_install_image_unload_hook (mono_class_unregister_image_generic_subclasses, NULL);
+}
+
+void
+mono_generic_sharing_cleanup (void)
+{
+       mono_remove_image_unload_hook (mono_class_unregister_image_generic_subclasses, NULL);
+
+       if (generic_subclass_hash)
+               g_hash_table_destroy (generic_subclass_hash);
 }
index fcb2ca1109df19729f605f5da8eff44f6ca8d844..f623b2e7cba7399585daebd2f9f8643b31053e8b 100644 (file)
@@ -6294,6 +6294,8 @@ mini_cleanup (MonoDomain *domain)
 
        mono_arch_cleanup ();
 
+       mono_generic_sharing_cleanup ();
+
        mono_cleanup ();
 
        mono_trace_cleanup ();
index 01a0b17d23ec34cfefad8eb8d48e4ebd7b9d016c..5059104e6dc57f5bef9c6de1f19d17df09ce7ef1 100644 (file)
@@ -2071,6 +2071,7 @@ gpointer mono_helper_get_rgctx_other_ptr (MonoClass *caller_class, MonoVTable *v
                                          gint32 rgctx_index) MONO_INTERNAL;
 
 void mono_generic_sharing_init (void) MONO_INTERNAL;
+void mono_generic_sharing_cleanup (void) MONO_INTERNAL;
 
 MonoClass* mini_class_get_container_class (MonoClass *class) MONO_INTERNAL;
 MonoGenericContext* mini_class_get_context (MonoClass *class) MONO_INTERNAL;