Fixes process names trimmed to 15 chars.
[mono.git] / mono / metadata / reflection.c
index d085e1c008e29a830f876bc7655a531ae86e8695..096db3127ae0586e894e39196b9f2b367716450d 100644 (file)
@@ -220,6 +220,38 @@ mono_reflection_init (void)
 {
 }
 
+static inline void
+dynamic_image_lock (MonoDynamicImage *image)
+{
+       mono_image_lock ((MonoImage*)image);
+}
+
+static inline void
+dynamic_image_unlock (MonoDynamicImage *image)
+{
+       mono_image_unlock ((MonoImage*)image);
+}
+
+static void
+register_dyn_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
+{
+       dynamic_image_lock (assembly);
+       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+       dynamic_image_unlock (assembly);
+}
+
+static MonoObject*
+lookup_dyn_token (MonoDynamicImage *assembly, guint32 token)
+{
+       MonoObject *obj;
+
+       dynamic_image_lock (assembly);
+       obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+       dynamic_image_unlock (assembly);
+
+       return obj;
+}
+
 static void
 sigbuffer_init (SigBuffer *buf, int size)
 {
@@ -2382,7 +2414,7 @@ mono_image_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboo
                        (type->type != MONO_TYPE_MVAR)) {
                MonoReflectionTypeBuilder *tb = mono_class_get_ref_info (klass);
                token = MONO_TYPEDEFORREF_TYPEDEF | (tb->table_idx << MONO_TYPEDEFORREF_BITS);
-               mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+               register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
                return token;
        }
 
@@ -2405,7 +2437,7 @@ mono_image_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboo
        token = MONO_TYPEDEFORREF_TYPEREF | (table->next_idx << MONO_TYPEDEFORREF_BITS); /* typeref */
        g_hash_table_insert (assembly->typeref, type, GUINT_TO_POINTER(token));
        table->next_idx ++;
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+       register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
        return token;
 }
 
@@ -4788,7 +4820,7 @@ mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str)
                idx = assembly->us.index ++;
        }
 
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (MONO_TOKEN_STRING | idx), str);
+       register_dyn_token (assembly, MONO_TOKEN_STRING | idx, (MonoObject*)str);
 
        return MONO_TOKEN_STRING | idx;
 }
@@ -4888,7 +4920,7 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, Mon
        }
 
        g_hash_table_insert (assembly->vararg_aux_hash, GUINT_TO_POINTER (token), sig);
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+       register_dyn_token (assembly, token, obj);
        return token;
 }
 
@@ -5059,13 +5091,17 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
 void
 mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
 {
-       MonoObject *prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+       MonoObject *prev;
+
+       dynamic_image_lock (assembly);
+       prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
        if (prev) {
                /* There could be multiple MethodInfo objects with the same token */
                //g_assert (prev == obj);
        } else {
                mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
        }
+       dynamic_image_unlock (assembly);
 }
 
 static MonoDynamicImage*
@@ -7484,6 +7520,9 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
        if (!image)
                image = mono_defaults.corlib;
 
+       if (!rootimage)
+               rootimage = mono_defaults.corlib;
+
        if (ignorecase) {
                MonoError error;
                klass = mono_class_from_name_case_checked (image, info->name_space, info->name, &error);
@@ -8265,7 +8304,7 @@ create_custom_attr (MonoImage *image, MonoMethod *method, const guchar *data, gu
                memset (params, 0, sizeof (void*) * sig->param_count);
        } else {
                /* Allocate using GC so it gets GC tracking */
-               params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), NULL);
+               params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), MONO_GC_DESCRIPTOR_NULL);
        }
 
        /* skip prolog */
@@ -10025,8 +10064,7 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
                g_assert (mono_class_get_ref_info (klass) == tb);
        }
 
-       mono_g_hash_table_insert (tb->module->dynamic_image->tokens,
-               GUINT_TO_POINTER (MONO_TOKEN_TYPE_DEF | tb->table_idx), tb);
+       register_dyn_token (tb->module->dynamic_image, MONO_TOKEN_TYPE_DEF | tb->table_idx, (MonoObject*)tb);
 
        if (parent != NULL) {
                mono_class_setup_parent (klass, parent);
@@ -11825,7 +11863,7 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
 gboolean
 mono_reflection_is_valid_dynamic_token (MonoDynamicImage *image, guint32 token)
 {
-       return mono_g_hash_table_lookup (image->tokens, GUINT_TO_POINTER (token)) != NULL;
+       return lookup_dyn_token (image, token) != NULL;
 }
 
 MonoMethodSignature *
@@ -11862,9 +11900,7 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean
        MonoObject *obj;
        MonoClass *klass;
 
-       mono_loader_lock ();
-       obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
-       mono_loader_unlock ();
+       obj = lookup_dyn_token (assembly, token);
        if (!obj) {
                if (valid_token)
                        g_error ("Could not find required dynamic token 0x%08x", token);