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