In .:
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 12 Feb 2009 00:13:08 +0000 (00:13 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 12 Feb 2009 00:13:08 +0000 (00:13 -0000)
2009-02-11 Rodrigo Kumpera  <rkumpera@novell.com>

* metadata-internals.h (struct MonoImage): Add lock field. Export mono_image_lock and
mono_image_unlock.

* image.c (mono_image_init): Init the lock field.

* image.c (mono_image_init): Cleanup the lock field.

* image.c: Add mono_image_(un)lock functions.

svn path=/trunk/mono/; revision=126666

mono/metadata/ChangeLog
mono/metadata/image.c
mono/metadata/metadata-internals.h

index 3455cb09ddce3e0f52fb3e60a3fa9e8b931792ac..fe0496fe5a0b9f18dc626de8af4608699a60d717 100644 (file)
@@ -1,3 +1,14 @@
+2009-02-11 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * metadata-internals.h (struct MonoImage): Add lock field. Export mono_image_lock and
+       mono_image_unlock.
+
+       * image.c (mono_image_init): Init the lock field.
+       * image.c (mono_image_init): Cleanup the lock field.
+
+       * image.c: Add mono_image_(un)lock functions.
+
 2009-02-11  Mark Probst  <mark.probst@gmail.com>
 
        * class.c, class-internals.h: mono_method_get_context_general()
@@ -17,7 +28,7 @@
        * loader.c (mono_method_get_wrapper_data): Handle inflated methods as well.
 
        * loader.c (mono_loader_lock): Add a comment pointing to the locking document.
-
+       
 2009-02-11 Rodrigo Kumpera  <rkumpera@novell.com>
 
        * metadata.c: Make mono_image_alloc_lock and mono_image_alloc0_lock non static.
index 5f393eb072c59ad36acf67173d30fc6a0e009e9c..16c50dcce358df1a55f2cd193de030c43f008d37 100644 (file)
@@ -614,6 +614,7 @@ mono_image_init (MonoImage *image)
        image->method_signatures = g_hash_table_new (NULL, NULL);
 
        image->property_hash = mono_property_hash_new ();
+       InitializeCriticalSection (&image->lock);
 }
 
 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
@@ -1519,6 +1520,8 @@ mono_image_close (MonoImage *image)
                mono_mempool_destroy (image->mempool);
        }
 
+       DeleteCriticalSection (&image->lock);
+
        mono_profiler_module_event (image, MONO_PROFILE_END_UNLOAD);
 }
 
@@ -2005,3 +2008,14 @@ mono_image_strdup (MonoImage *image, const char *s)
        return mono_mempool_strdup (image->mempool, s);
 }
 
+void
+mono_image_lock (MonoImage *image)
+{
+       EnterCriticalSection (&image->lock);
+}
+
+void
+mono_image_unlock (MonoImage *image)
+{
+       LeaveCriticalSection (&image->lock);
+}
index b95a1087eb2b1fb7a90b6902e8b06994fee5e0f6..086a91585d6b8b963eb765dfd571b9625265655b 100644 (file)
@@ -246,6 +246,12 @@ struct _MonoImage {
 
        /* interfaces IDs from this image */
        MonoBitSet *interface_bitset;
+
+       /*
+        * No other runtime locks must be taken while holding this lock.
+        * It's meant to be used only to mutate a query structures part of this image.
+        */
+       CRITICAL_SECTION    lock;
 };
 
 enum {
@@ -374,6 +380,12 @@ mono_image_alloc0 (MonoImage *image, guint size) MONO_INTERNAL;
 char*
 mono_image_strdup (MonoImage *image, const char *s) MONO_INTERNAL;
 
+void
+mono_image_lock (MonoImage *image) MONO_INTERNAL;
+
+void
+mono_image_unlock (MonoImage *image) MONO_INTERNAL;
+
 MonoType*
 mono_metadata_get_shared_type (MonoType *type) MONO_INTERNAL;