Author: zoltan
Date: 2007-12-23 10:20:02 -0500 (Sun, 23 Dec 2007)
New Revision: 91836

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/assembly.c
Log:
2007-12-23  Zoltan Varga  <[EMAIL PROTECTED]>

        * assembly.c: Significally simplify code now that referenced assemblies 
are 
        loaded lazily. Get rid of the 'loading' hashtables. Hopefully fixes 
#347629.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-12-23 14:58:01 UTC (rev 91835)
+++ trunk/mono/mono/metadata/ChangeLog  2007-12-23 15:20:02 UTC (rev 91836)
@@ -1,5 +1,8 @@
 2007-12-23  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * assembly.c: Significally simplify code now that referenced assemblies 
are 
+       loaded lazily. Get rid of the 'loading' hashtables. Hopefully fixes 
#347629.
+
        * threads.h: Don't include  the internal threads-types.h header file. 
Fixes
        #349952.
 

Modified: trunk/mono/mono/metadata/assembly.c
===================================================================
--- trunk/mono/mono/metadata/assembly.c 2007-12-23 14:58:01 UTC (rev 91835)
+++ trunk/mono/mono/metadata/assembly.c 2007-12-23 15:20:02 UTC (rev 91836)
@@ -121,12 +121,6 @@
 #define mono_assemblies_unlock() LeaveCriticalSection (&assemblies_mutex)
 static CRITICAL_SECTION assemblies_mutex;
 
-/* A hastable of thread->assembly list mappings */
-static GHashTable *assemblies_loading;
-
-/* A hashtable of reflection only load thread->assemblies mappings */
-static GHashTable *assemblies_refonly_loading;
-
 /* If defined, points to the bundled assembly information */
 const MonoBundledAssembly **bundles;
 
@@ -381,27 +375,12 @@
 static MonoAssembly*
 search_loaded (MonoAssemblyName* aname, gboolean refonly)
 {
-       GList *tmp;
        MonoAssembly *ass;
-       GList *loading;
 
        ass = mono_assembly_invoke_search_hook_internal (aname, refonly, FALSE);
        if (ass)
                return ass;
-       
-       /*
-        * The assembly might be under load by this thread. In this case, it is
-        * safe to return an incomplete instance to prevent loops.
-        */
-       loading = g_hash_table_lookup (refonly ? assemblies_refonly_loading : 
assemblies_loading, (gpointer)GetCurrentThreadId ());
-       for (tmp = loading; tmp; tmp = tmp->next) {
-               ass = tmp->data;
-               if (!mono_assembly_names_equal (aname, &ass->aname))
-                       continue;
 
-               return ass;
-       }
-
        return NULL;
 }
 
@@ -648,9 +627,6 @@
        check_extra_gac_path_env ();
 
        InitializeCriticalSection (&assemblies_mutex);
-
-       assemblies_loading = g_hash_table_new (NULL, NULL);
-       assemblies_refonly_loading = g_hash_table_new (NULL, NULL);
 }
 
 gboolean
@@ -856,8 +832,11 @@
         * it inside a critical section.
         */
        mono_assemblies_lock ();
-       if (!image->references)
-               mono_assembly_load_references (image, &status);
+       if (!image->references) {
+               MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLYREF];
+       
+               image->references = g_new0 (MonoAssembly *, t->rows + 1);
+       }
        reference = image->references [index];
        mono_assemblies_unlock ();
        if (reference)
@@ -939,13 +918,8 @@
 void
 mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
 {
-       MonoTableInfo *t;
-
+       /* This is a no-op now but it is part of the embedding API so we can't 
remove it */
        *status = MONO_IMAGE_OK;
-
-       t = &image->tables [MONO_TABLE_ASSEMBLYREF];
-       
-       image->references = g_new0 (MonoAssembly *, t->rows + 1);
 }
 
 typedef struct AssemblyLoadHook AssemblyLoadHook;
@@ -1415,8 +1389,6 @@
 {
        MonoAssembly *ass, *ass2;
        char *base_dir;
-       GList *loading;
-       GHashTable *ass_loading;
 
        if (!image->tables [MONO_TABLE_ASSEMBLY].rows) {
                /* 'image' doesn't have a manifest -- maybe someone is trying 
to Assembly.Load a .netmodule */
@@ -1443,14 +1415,6 @@
 #endif
 
        /*
-        * To avoid deadlocks and scalability problems, we load assemblies 
outside
-        * the assembly lock. This means that multiple threads might try to load
-        * the same assembly at the same time. The first one to load it 
completely
-        * "wins", the other threads free their copy and use the one loaded by
-        * the winning thread.
-        */
-
-       /*
         * Create assembly struct, and enter it into the assembly cache
         */
        ass = g_new0 (MonoAssembly, 1);
@@ -1460,11 +1424,11 @@
 
        mono_profiler_assembly_event (ass, MONO_PROFILE_START_LOAD);
 
+       mono_assembly_fill_assembly_name (image, &ass->aname);
+
        /* Add a non-temporary reference because of ass->image */
        mono_image_addref (image);
 
-       mono_assembly_fill_assembly_name (image, &ass->aname);
-
        mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Image addref %s %p 
-> %s %p: %d\n", ass->aname.name, ass, image->name, image, image->ref_count);
 
        /* 
@@ -1483,48 +1447,10 @@
                        return ass2;
                }
        }
-       ass_loading = refonly ? assemblies_refonly_loading : assemblies_loading;
-       loading = g_hash_table_lookup (ass_loading, 
(gpointer)GetCurrentThreadId ());
-       loading = g_list_prepend (loading, ass);
-       g_hash_table_insert (ass_loading, (gpointer)GetCurrentThreadId (), 
loading);
-       mono_assemblies_unlock ();
 
        g_assert (image->assembly == NULL);
        image->assembly = ass;
 
-       mono_assembly_load_references (image, status);
-
-       mono_assemblies_lock ();
-
-       loading = g_hash_table_lookup (ass_loading, 
(gpointer)GetCurrentThreadId ());
-       loading = g_list_remove (loading, ass);
-       if (loading == NULL)
-               /* Prevent memory leaks */
-               g_hash_table_remove (ass_loading, (gpointer)GetCurrentThreadId 
());
-       else
-               g_hash_table_insert (ass_loading, (gpointer)GetCurrentThreadId 
(), loading);
-       if (*status != MONO_IMAGE_OK) {
-               mono_assemblies_unlock ();
-               
-               mono_profiler_assembly_loaded (ass, MONO_PROFILE_FAILED);
-               
-               mono_assembly_close (ass);
-               return NULL;
-       }
-
-       if (ass->aname.name) {
-               ass2 = search_loaded (&ass->aname, refonly);
-               if (ass2) {
-                       /* Somebody else has loaded the assembly before us */
-                       mono_assemblies_unlock ();
-                       
-                       mono_profiler_assembly_loaded (ass, 
MONO_PROFILE_FAILED);
-                       
-                       mono_assembly_close (ass);
-                       return ass2;
-               }
-       }
-
        loaded_assemblies = g_list_prepend (loaded_assemblies, ass);
        if (mono_defaults.internals_visible_class)
                mono_assembly_load_friends (ass);
@@ -2395,14 +2321,7 @@
 MonoImage*
 mono_assembly_load_module (MonoAssembly *assembly, guint32 idx)
 {
-       MonoImageOpenStatus status;
-       MonoImage *module;
-
-       module = mono_image_load_file_for_image (assembly->image, idx);
-       if (module)
-               mono_assembly_load_references (module, &status);
-
-       return module;
+       return mono_image_load_file_for_image (assembly->image, idx);
 }
 
 void
@@ -2435,9 +2354,6 @@
 
        DeleteCriticalSection (&assemblies_mutex);
 
-       g_hash_table_destroy (assemblies_loading);
-       g_hash_table_destroy (assemblies_refonly_loading);
-
        for (l = loaded_assembly_bindings; l; l = l->next) {
                MonoAssemblyBindingInfo *info = l->data;
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to