* [runtime] Move the sre source files to 'common_sources', they no longer have compile time gc dependencies after the Boehm GC root changes. sre.c still depends on the gc dependent caching code in reflection-cache.h.
* [runtime] Remove compile time gc dependencies from the reflection caching code.
* [runtime] Move reflection.c/sre.c to 'common_sources', they no longer have compile time gc dependencies.
w32handle-namespace.c \
w32handle.h \
w32handle.c \
w32handle-namespace.c \
w32handle.h \
w32handle.c \
+ w32error.h \
+ reflection.c \
+ dynamic-image.c \
+ sre.c \
+ sre-encode.c \
+ sre-save.c \
+ custom-attrs.c
# These source files have compile time dependencies on GC code
gc_dependent_sources = \
# These source files have compile time dependencies on GC code
gc_dependent_sources = \
monitor.c \
mono-hash.c \
mono-conc-hash.c \
monitor.c \
mono-hash.c \
mono-conc-hash.c \
- object.c \
- dynamic-image.c \
- sre.c \
- sre-encode.c \
- sre-save.c \
- custom-attrs.c \
- reflection.c
-
boehm_sources = \
boehm-gc.c
boehm_sources = \
boehm-gc.c
guint
reflected_hash (gconstpointer a);
guint
reflected_hash (gconstpointer a);
-#ifdef HAVE_BOEHM_GC
-/* ReflectedEntry doesn't need to be GC tracked */
-#define ALLOC_REFENTRY g_new0 (ReflectedEntry, 1)
-#define FREE_REFENTRY(entry) g_free ((entry))
-#define REFENTRY_REQUIRES_CLEANUP
-#else
-#define ALLOC_REFENTRY (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry))
-/* FIXME: */
-#define FREE_REFENTRY(entry)
-#endif
+static inline ReflectedEntry*
+alloc_reflected_entry (MonoDomain *domain)
+{
+ if (!mono_gc_is_moving ())
+ return g_new0 (ReflectedEntry, 1);
+ else
+ return (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry));
+}
+
+static void
+free_reflected_entry (ReflectedEntry *entry)
+{
+ if (!mono_gc_is_moving ())
+ g_free (entry);
+}
static inline MonoObject*
cache_object (MonoDomain *domain, MonoClass *klass, gpointer item, MonoObject* o)
static inline MonoObject*
cache_object (MonoDomain *domain, MonoClass *klass, gpointer item, MonoObject* o)
obj = (MonoObject*) mono_conc_g_hash_table_lookup (domain->refobject_hash, &pe);
if (obj == NULL) {
obj = (MonoObject*) mono_conc_g_hash_table_lookup (domain->refobject_hash, &pe);
if (obj == NULL) {
- ReflectedEntry *e = ALLOC_REFENTRY;
+ ReflectedEntry *e = alloc_reflected_entry (domain);
e->item = item;
e->refclass = klass;
mono_conc_g_hash_table_insert (domain->refobject_hash, e, o);
e->item = item;
e->refclass = klass;
mono_conc_g_hash_table_insert (domain->refobject_hash, e, o);
MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_conc_g_hash_table_lookup (domain->refobject_hash, &pe));
if (MONO_HANDLE_IS_NULL (obj)) {
MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_conc_g_hash_table_lookup (domain->refobject_hash, &pe));
if (MONO_HANDLE_IS_NULL (obj)) {
- ReflectedEntry *e = ALLOC_REFENTRY;
+ ReflectedEntry *e = alloc_reflected_entry (domain);
e->item = item;
e->refclass = klass;
mono_conc_g_hash_table_insert (domain->refobject_hash, e, MONO_HANDLE_RAW (o));
e->item = item;
e->refclass = klass;
mono_conc_g_hash_table_insert (domain->refobject_hash, e, MONO_HANDLE_RAW (o));
/**
* mono_custom_attrs_free:
*/
/**
* mono_custom_attrs_free:
*/
gboolean
reflected_equal (gconstpointer a, gconstpointer b)
{
gboolean
reflected_equal (gconstpointer a, gconstpointer b)
{
static void
clear_cached_object (MonoDomain *domain, gpointer o, MonoClass *klass)
{
static void
clear_cached_object (MonoDomain *domain, gpointer o, MonoClass *klass)
{
if (mono_conc_g_hash_table_lookup_extended (domain->refobject_hash, &pe, &orig_pe, &orig_value)) {
mono_conc_g_hash_table_remove (domain->refobject_hash, &pe);
if (mono_conc_g_hash_table_lookup_extended (domain->refobject_hash, &pe, &orig_pe, &orig_value)) {
mono_conc_g_hash_table_remove (domain->refobject_hash, &pe);
- FREE_REFENTRY (orig_pe);
+ free_reflected_entry (orig_pe);
}
}
mono_domain_unlock (domain);
}
}
}
mono_domain_unlock (domain);
}
-#ifdef REFENTRY_REQUIRES_CLEANUP
static void
cleanup_refobject_hash (gpointer key, gpointer value, gpointer user_data)
{
static void
cleanup_refobject_hash (gpointer key, gpointer value, gpointer user_data)
{
+ free_reflected_entry (key);
void
mono_reflection_cleanup_domain (MonoDomain *domain)
{
if (domain->refobject_hash) {
void
mono_reflection_cleanup_domain (MonoDomain *domain)
{
if (domain->refobject_hash) {
-/*let's avoid scanning the whole hashtable if not needed*/
-#ifdef REFENTRY_REQUIRES_CLEANUP
mono_conc_g_hash_table_foreach (domain->refobject_hash, cleanup_refobject_hash, NULL);
mono_conc_g_hash_table_foreach (domain->refobject_hash, cleanup_refobject_hash, NULL);
mono_conc_g_hash_table_destroy (domain->refobject_hash);
domain->refobject_hash = NULL;
}
}
mono_conc_g_hash_table_destroy (domain->refobject_hash);
domain->refobject_hash = NULL;
}
}
/**
* mono_assembly_get_object:
* \param domain an app domain
/**
* mono_assembly_get_object:
* \param domain an app domain