[runtime] Add a 'debug-domain-unload' MONO_DEBUG option to make the DEBUG_DOMAIN_UNLO...
authorZoltan Varga <vargaz@gmail.com>
Fri, 21 Mar 2014 01:09:21 +0000 (21:09 -0400)
committerZoltan Varga <vargaz@gmail.com>
Fri, 21 Mar 2014 01:09:31 +0000 (21:09 -0400)
mono/metadata/domain-internals.h
mono/metadata/domain.c
mono/mini/mini.c

index 8ffe885532fd84f833320445a4b00331c0e62452..5fec1f406e9d42a690e9d02a3b793e23e09450ef 100644 (file)
@@ -658,4 +658,6 @@ void mono_assembly_cleanup_domain_bindings (guint32 domain_id) MONO_INTERNAL;
 
 MonoJitInfo* mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_aot) MONO_INTERNAL;
 
+void mono_enable_debug_domain_unload (gboolean enable);
+
 #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */
index 447e860164654c913ca0d35a916a283a97728594..c408a996e469ae6bc02681acc6ff6caa43883d86 100644 (file)
@@ -89,6 +89,7 @@ static guint16 appdomain_list_size = 0;
 static guint16 appdomain_next = 0;
 static MonoDomain **appdomains_list = NULL;
 static MonoImage *exe_image;
+static gboolean debug_domain_unload;
 
 gboolean mono_dont_free_domains;
 
@@ -1341,6 +1342,10 @@ mono_init_internal (const char *filename, const char *exe_filename, const char *
        const MonoRuntimeInfo* runtimes [G_N_ELEMENTS (supported_runtimes) + 1];
        int n;
 
+#ifdef DEBUG_DOMAIN_UNLOAD
+       debug_domain_unload = TRUE;
+#endif
+
        if (domain)
                g_assert_not_reached ();
 
@@ -2088,18 +2093,18 @@ mono_domain_free (MonoDomain *domain, gboolean force)
        max_domain_code_alloc = MAX (max_domain_code_alloc, code_alloc);
        max_domain_code_size = MAX (max_domain_code_size, code_size);
 
-#ifdef DEBUG_DOMAIN_UNLOAD
-       mono_mempool_invalidate (domain->mp);
-       mono_code_manager_invalidate (domain->code_mp);
-#else
+       if (debug_domain_unload) {
+               mono_mempool_invalidate (domain->mp);
+               mono_code_manager_invalidate (domain->code_mp);
+       } else {
 #ifndef DISABLE_PERFCOUNTERS
-       mono_perfcounters->loader_bytes -= mono_mempool_get_allocated (domain->mp);
+               mono_perfcounters->loader_bytes -= mono_mempool_get_allocated (domain->mp);
 #endif
-       mono_mempool_destroy (domain->mp);
-       domain->mp = NULL;
-       mono_code_manager_destroy (domain->code_mp);
-       domain->code_mp = NULL;
-#endif 
+               mono_mempool_destroy (domain->mp);
+               domain->mp = NULL;
+               mono_code_manager_destroy (domain->code_mp);
+               domain->code_mp = NULL;
+       }
        lock_free_mempool_free (domain->lock_free_mp);
        domain->lock_free_mp = NULL;
 
@@ -2755,3 +2760,9 @@ mono_framework_version (void)
 {
        return current_runtime->framework_version [0] - '0';
 }
+
+void
+mono_enable_debug_domain_unload (gboolean enable)
+{
+       debug_domain_unload = enable;
+}
index 941ced811110b980b7863b142fc7bae530839ab4..86a1f1592ee07bcec6a3c730cabf4de7dd88530c 100644 (file)
@@ -6988,9 +6988,11 @@ mini_parse_debug_options (void)
                        debug_options.soft_breakpoints = TRUE;
                else if (!strcmp (arg, "check-pinvoke-callconv"))
                        debug_options.check_pinvoke_callconv = TRUE;
+               else if (!strcmp (arg, "debug-domain-unload"))
+                       mono_enable_debug_domain_unload (TRUE);
                else {
                        fprintf (stderr, "Invalid option for the MONO_DEBUG env variable: %s\n", arg);
-                       fprintf (stderr, "Available options: 'handle-sigint', 'keep-delegates', 'reverse-pinvoke-exceptions', 'collect-pagefault-stats', 'break-on-unverified', 'no-gdb-backtrace', 'dont-free-domains', 'suspend-on-sigsegv', 'suspend-on-exception', 'suspend-on-unhandled', 'dyn-runtime-invoke', 'gdb', 'explicit-null-checks', 'init-stacks', 'check-pinvoke-callconv'\n");
+                       fprintf (stderr, "Available options: 'handle-sigint', 'keep-delegates', 'reverse-pinvoke-exceptions', 'collect-pagefault-stats', 'break-on-unverified', 'no-gdb-backtrace', 'dont-free-domains', 'suspend-on-sigsegv', 'suspend-on-exception', 'suspend-on-unhandled', 'dyn-runtime-invoke', 'gdb', 'explicit-null-checks', 'init-stacks', 'check-pinvoke-callconv', 'debug-domain-unload'\n");
                        exit (1);
                }
        }