Fix another bunch of shutdown leaks.
authorZoltan Varga <vargaz@gmail.com>
Fri, 20 Aug 2010 12:55:36 +0000 (14:55 +0200)
committerZoltan Varga <vargaz@gmail.com>
Fri, 20 Aug 2010 12:55:36 +0000 (14:55 +0200)
mono/metadata/domain.c
mono/metadata/monitor.c
mono/metadata/mono-config.c
mono/metadata/mono-config.h
mono/metadata/object.c
mono/metadata/threads.c

index b974ba57d96ddc5feb8119aee8580340789320a6..0f3dfc25d1a2a722f6a2caf67ba66debb4ed1c3d 100644 (file)
@@ -1742,6 +1742,7 @@ mono_cleanup (void)
        mono_assembly_close (mono_defaults.corlib->assembly);
        mono_defaults.corlib = NULL;
 
+       mono_config_cleanup ();
        mono_loader_cleanup ();
        mono_classes_cleanup ();
        mono_assemblies_cleanup ();
index fc7038490faebae35fb1763ed0bdbbde7eab8553..c88d40c126794d5dc7c9d390c38afebac8f6c057 100644 (file)
@@ -125,7 +125,14 @@ mono_monitor_init (void)
 void
 mono_monitor_cleanup (void)
 {
+       MonitorArray *marray, *next = NULL;
+
        /*DeleteCriticalSection (&monitor_mutex);*/
+
+       for (marray = monitor_allocated; marray; marray = next) {
+               next = marray->next;
+               g_free (marray);
+       }
 }
 
 /*
index 8f3b63303858e5d4d658540638c7731f3e63289b..34f0326148b37bac7e44c8bef371c2db6bf98931 100644 (file)
@@ -132,6 +132,9 @@ mono_parser = {
 
 static GHashTable *config_handlers;
 
+static const char *mono_cfg_dir = NULL;
+static char *mono_cfg_dir_allocated = NULL;
+
 /* when this interface is stable, export it. */
 typedef struct MonoParseHandler MonoParseHandler;
 
@@ -368,6 +371,13 @@ mono_config_init (void)
        g_hash_table_insert (config_handlers, (gpointer) legacyUEP_handler.element_name, (gpointer) &legacyUEP_handler);
 }
 
+void
+mono_config_cleanup (void)
+{
+       g_hash_table_destroy (config_handlers);
+       g_free (mono_cfg_dir_allocated);
+}
+
 /* FIXME: error handling */
 
 static void
@@ -567,8 +577,6 @@ mono_config_parse (const char *filename) {
 #endif
 }
 
-static const char *mono_cfg_dir = NULL;
-
 /* Invoked during startup */
 void
 mono_set_config_dir (const char *dir)
@@ -576,7 +584,7 @@ mono_set_config_dir (const char *dir)
        /* If this variable is set, overrides the directory computed */
        mono_cfg_dir = g_getenv ("MONO_CFG_DIR");
        if (mono_cfg_dir == NULL)
-               mono_cfg_dir = g_strdup (dir);
+               mono_cfg_dir = mono_cfg_dir_allocated = g_strdup (dir);
 }
 
 const char* 
index 81720776077262f4ae75bd3efda25e2b2641e27d..0b46425cdb5985a4a5a094a29b811266f3480df9 100644 (file)
@@ -18,6 +18,7 @@ void        mono_set_config_dir (const char *dir);
 
 const char* mono_get_machine_config (void);
 
+void mono_config_cleanup      (void);
 void mono_config_parse        (const char *filename);
 void mono_config_for_assembly (MonoImage *assembly);
 void mono_config_parse_memory (const char *buffer);
index 0a361efc4f79d4ba3badbde1edb7f6f98ba78fd9..f5d7394f67a07fcaa112914d70a9b95f00db2c55 100644 (file)
@@ -79,6 +79,9 @@ get_default_field_value (MonoDomain* domain, MonoClassField *field, void *value)
 static MonoString*
 mono_ldstr_metadata_sig (MonoDomain *domain, const char* sig);
 
+static void
+free_main_args (void);
+
 #define ldstr_lock() EnterCriticalSection (&ldstr_section)
 #define ldstr_unlock() LeaveCriticalSection (&ldstr_section)
 static CRITICAL_SECTION ldstr_section;
@@ -189,6 +192,8 @@ mono_type_initialization_cleanup (void)
        DeleteCriticalSection (&ldstr_section);
        g_hash_table_destroy (type_initialization_hash);
        g_hash_table_destroy (blocked_thread_hash);
+
+       free_main_args ();
 }
 
 /**
@@ -3342,6 +3347,16 @@ mono_runtime_get_main_args (void)
        return res;
 }
 
+static void
+free_main_args (void)
+{
+       int i;
+
+       for (i = 0; i < num_main_args; ++i)
+               g_free (main_args [i]);
+       g_free (main_args);
+}
+
 /**
  * mono_runtime_run_main:
  * @method: the method to start the application with (usually Main)
index b6116d57fbb2af32d7f18fadd94c10b770029940..9b5e2881a84d80c822af683fcf8f254ae25e027c 100644 (file)
@@ -3808,8 +3808,14 @@ do_free_special (gpointer key, gpointer value, gpointer data)
                        mono_g_hash_table_foreach (threads, free_thread_static_data_helper, &data);
                item->offset = offset;
                item->size = size;
-               item->next = thread_static_info.freelist;
-               thread_static_info.freelist = item;
+
+               if (!mono_runtime_is_shutting_down ()) {
+                       item->next = thread_static_info.freelist;
+                       thread_static_info.freelist = item;
+               } else {
+                       /* We could be called during shutdown after mono_thread_cleanup () is called */
+                       g_free (item);
+               }
        } else {
                /* FIXME: free context static data as well */
        }