2010-07-23 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 22 Jul 2010 23:54:53 +0000 (07:54 +0800)
committerPhil Garcia <phil@thinkedge.com>
Fri, 23 Jul 2010 00:32:56 +0000 (08:32 +0800)
* loader.c (mono_loader_lock_if_inited): New helper function which can be called
during startup before the loader lock is initialized.
(mono_loader_unlock_if_inited): Ditto.

mono/metadata/ChangeLog
mono/metadata/class-internals.h
mono/metadata/loader.c

index 9cb2ee5a48b9692709afb31b865de33a8fc07bef..500f501c0f51deef11fc69f67105568e19963fcd 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-23  Zoltan Varga  <vargaz@gmail.com>
+
+       * loader.c (mono_loader_lock_if_inited): New helper function which can be called
+       during startup before the loader lock is initialized.
+       (mono_loader_unlock_if_inited): Ditto.
+
 2010-07-21  Geoff Norton  <gnorton@novell.com>
 
        * sgen-archdep.h: Fix the build on amd64-darwin.
index 119545b678e439a804a30846c166416126ce88da..a03de2072c2943afca7cdf71af0090714102d942 100644 (file)
@@ -1092,6 +1092,12 @@ mono_loader_lock_track_ownership (gboolean track) MONO_INTERNAL;
 gboolean
 mono_loader_lock_is_owned_by_self (void) MONO_INTERNAL;
 
+void
+mono_loader_lock_if_inited (void) MONO_INTERNAL;
+
+void
+mono_loader_unlock_if_inited (void) MONO_INTERNAL;
+
 void
 mono_loader_set_error_assembly_load (const char *assembly_name, gboolean ref_only) MONO_INTERNAL;
 
index 746bb2eea45f9123747772f3457b10482993816b..2029db088bfd9d89b665cf96c81b521d6dd14c02 100644 (file)
@@ -54,6 +54,7 @@ MonoDefaults mono_defaults;
  * domain lock.
  */
 static CRITICAL_SECTION loader_mutex;
+static gboolean loader_lock_inited;
 
 /* Statistics */
 static guint32 inflated_signatures_size;
@@ -77,6 +78,7 @@ mono_loader_init ()
 
        if (!inited) {
                InitializeCriticalSection (&loader_mutex);
+               loader_lock_inited = TRUE;
 
                loader_error_thread_id = TlsAlloc ();
                loader_lock_nest_id = TlsAlloc ();
@@ -97,6 +99,7 @@ mono_loader_cleanup (void)
        TlsFree (loader_lock_nest_id);
 
        /*DeleteCriticalSection (&loader_mutex);*/
+       loader_lock_inited = FALSE;
 }
 
 /*
@@ -2090,6 +2093,26 @@ mono_loader_lock_is_owned_by_self (void)
        return GPOINTER_TO_UINT (TlsGetValue (loader_lock_nest_id)) > 0;
 }
 
+/*
+ * mono_loader_lock_if_inited:
+ *
+ *   Acquire the loader lock if it has been initialized, no-op otherwise. This can
+ * be used in runtime initialization code which can be executed before mono_loader_init ().
+ */
+void
+mono_loader_lock_if_inited (void)
+{
+       if (loader_lock_inited)
+               mono_loader_lock ();
+}
+
+void
+mono_loader_unlock_if_inited (void)
+{
+       if (loader_lock_inited)
+               mono_loader_unlock ();
+}
+
 /**
  * mono_method_signature:
  *