Apply patch from Steven Boswell (ulatekh@yahoo.com) to fix #5591
[mono.git] / mono / metadata / image.c
index 0646db66fdc16ccda5ed1c6881625c3696f7cc18..3cf7ee51666bb2aa01099f990da7b2bd0876cd3a 100644 (file)
@@ -196,8 +196,15 @@ mono_images_init (void)
 void
 mono_images_cleanup (void)
 {
+       GHashTableIter iter;
+       MonoImage *image;
+
        DeleteCriticalSection (&images_mutex);
 
+       g_hash_table_iter_init (&iter, loaded_images_hash);
+       while (g_hash_table_iter_next (&iter, NULL, (void**)&image))
+               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly image '%s' still loaded at shutdown.", image->name);
+
        g_hash_table_destroy (loaded_images_hash);
        g_hash_table_destroy (loaded_images_refonly_hash);
 
@@ -1013,6 +1020,12 @@ do_mono_image_open (const char *fname, MonoImageOpenStatus *status,
        image->raw_buffer_used = TRUE;
        image->raw_data_len = mono_file_map_size (filed);
        image->raw_data = mono_file_map (image->raw_data_len, MONO_MMAP_READ|MONO_MMAP_PRIVATE, mono_file_map_fd (filed), 0, &image->raw_data_handle);
+#if defined(HAVE_MMAP) && !defined (HOST_WIN32)
+       if (!image->raw_data) {
+               image->fileio_used = TRUE;
+               image->raw_data = mono_file_map_fileio (image->raw_data_len, MONO_MMAP_READ|MONO_MMAP_PRIVATE, mono_file_map_fd (filed), 0, &image->raw_data_handle);
+       }
+#endif
        if (!image->raw_data) {
                mono_file_map_close (filed);
                g_free (image);
@@ -1419,12 +1432,6 @@ free_mr_signatures (gpointer key, gpointer val, gpointer user_data)
 }
 */
 
-static void
-free_remoting_wrappers (gpointer key, gpointer val, gpointer user_data)
-{
-       g_free (val);
-}
-
 static void
 free_array_cache_entry (gpointer key, gpointer val, gpointer user_data)
 {
@@ -1552,8 +1559,14 @@ mono_image_close_except_pools (MonoImage *image)
 #endif
 
        if (image->raw_buffer_used) {
-               if (image->raw_data != NULL)
-                       mono_file_unmap (image->raw_data, image->raw_data_handle);
+               if (image->raw_data != NULL) {
+#ifndef HOST_WIN32
+                       if (image->fileio_used)
+                               mono_file_unmap_fileio (image->raw_data, image->raw_data_handle);
+                       else
+#endif
+                               mono_file_unmap (image->raw_data, image->raw_data_handle);
+               }
        }
        
        if (image->raw_data_allocated) {
@@ -1607,8 +1620,7 @@ mono_image_close_except_pools (MonoImage *image)
        free_hash (image->delegate_end_invoke_cache);
        free_hash (image->delegate_invoke_cache);
        free_hash (image->delegate_abstract_invoke_cache);
-       if (image->remoting_invoke_cache)
-               g_hash_table_foreach (image->remoting_invoke_cache, free_remoting_wrappers, NULL);
+       free_hash (image->delegate_bound_static_invoke_cache);
        free_hash (image->remoting_invoke_cache);
        free_hash (image->runtime_invoke_cache);
        free_hash (image->runtime_invoke_direct_cache);
@@ -1625,6 +1637,12 @@ mono_image_close_except_pools (MonoImage *image)
        free_hash (image->castclass_cache);
        free_hash (image->proxy_isinst_cache);
        free_hash (image->thunk_invoke_cache);
+       free_hash (image->var_cache_slow);
+       free_hash (image->mvar_cache_slow);
+       free_hash (image->wrapper_param_names);
+       free_hash (image->native_wrapper_aot_cache);
+       free_hash (image->pinvoke_scopes);
+       free_hash (image->pinvoke_scope_filenames);
 
        /* The ownership of signatures is not well defined */
        //g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL);