X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Fmetadata%2Freflection.c;h=627604406fceefe18db221ba5fa335ab50bcb0e6;hb=6b94388f8ec7403206260926e0dfccdece3d5eb8;hp=4e7ea49d961f36ac1741fbdb843eedf7e3a1c946;hpb=9a587b5266b8dbb30c8e4c8883faabcfc4c4b6d2;p=mono.git diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 4e7ea49d961..627604406fc 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -5091,7 +5091,7 @@ create_dynamic_mono_image (MonoDynamicAssembly *assembly, char *assembly_name, c #else image = g_new0 (MonoDynamicImage, 1); #endif - + mono_profiler_module_event (&image->image, MONO_PROFILE_START_LOAD); /*g_print ("created image %p\n", image);*/ @@ -5256,6 +5256,17 @@ mono_dynamic_image_free (MonoDynamicImage *image) } } +void +mono_dynamic_image_free_image (MonoDynamicImage *image) +{ + /* See create_dynamic_mono_image () */ +#if HAVE_BOEHM_GC + /* Allocated using GC_MALLOC */ +#else + g_free (image); +#endif +} + #ifndef DISABLE_REFLECTION_EMIT /* @@ -7951,7 +7962,7 @@ handle_type: val = load_cattr_value (image, &subc->byval_arg, p, end); obj = mono_object_new (mono_domain_get (), subc); g_assert (!subc->has_references); - mono_gc_memmove ((char*)obj + sizeof (MonoObject), val, mono_class_value_size (subc, NULL)); + mono_gc_memmove_atomic ((char*)obj + sizeof (MonoObject), val, mono_class_value_size (subc, NULL)); g_free (val); return obj; } @@ -9840,12 +9851,16 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb) /* Put into cache so mono_class_get () will find it. Skip nested types as those should not be available on the global scope. */ - if (!tb->nesting_type) { + if (!tb->nesting_type) mono_image_add_to_name_cache (klass->image, klass->name_space, klass->name, tb->table_idx); - } else { - klass->image->reflection_info_unregister_classes = - g_slist_prepend (klass->image->reflection_info_unregister_classes, klass); - } + + /* + We must register all types as we cannot rely on the name_cache hashtable since we find the class + by performing a mono_class_get which does the full resolution. + + Working around this semantics would require us to write a lot of code for no clear advantage. + */ + mono_image_append_class_to_reflection_info_set (klass); } else { g_assert (mono_class_get_ref_info (klass) == tb); } @@ -10571,9 +10586,9 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M * This table maps metadata structures representing inflated methods/fields * to the reflection objects representing their generic definitions. */ - mono_loader_lock (); + mono_image_lock ((MonoImage*)image); mono_g_hash_table_insert (image->generic_def_objects, imethod, rmethod); - mono_loader_unlock (); + mono_image_unlock ((MonoImage*)image); } if (!mono_verifier_is_method_valid_generic_instantiation (inflated)) @@ -10617,9 +10632,9 @@ inflate_mono_method (MonoClass *klass, MonoMethod *method, MonoObject *obj) if (method->is_generic && method->klass->image->dynamic) { MonoDynamicImage *image = (MonoDynamicImage*)method->klass->image; - mono_loader_lock (); + mono_image_lock ((MonoImage*)image); mono_g_hash_table_insert (image->generic_def_objects, imethod, obj); - mono_loader_unlock (); + mono_image_unlock ((MonoImage*)image); } return (MonoMethod *) imethod; } @@ -11458,9 +11473,7 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam gparam->type.type = &pklass->byval_arg; mono_class_set_ref_info (pklass, gparam); - mono_image_lock (image); - image->reflection_info_unregister_classes = g_slist_prepend (image->reflection_info_unregister_classes, pklass); - mono_image_unlock (image); + mono_image_append_class_to_reflection_info_set (pklass); } MonoArray *