Sre not gc dependent (#5264)
authorZoltan Varga <vargaz@gmail.com>
Thu, 27 Jul 2017 01:33:12 +0000 (21:33 -0400)
committerGitHub <noreply@github.com>
Thu, 27 Jul 2017 01:33:12 +0000 (21:33 -0400)
* [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.

mono/metadata/Makefile.am
mono/metadata/reflection-cache.h
mono/metadata/reflection.c

index 7b3799b9d8db9dc7a6cc7dc018d15aa37ca1b480..843df426056bed3218f3fa8c76bcc9f125b81436 100644 (file)
@@ -276,7 +276,13 @@ common_sources = \
        w32handle-namespace.c   \
        w32handle.h     \
        w32handle.c     \
-       w32error.h
+       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 = \
@@ -285,14 +291,7 @@ gc_dependent_sources = \
        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
-
+       object.c
 
 boehm_sources = \
        boehm-gc.c
index 594556fb68a13421102fcc88566cb0dbc62c634d..bba3cda2d1cf34661a7cfd1f8cdf757fd0845524 100644 (file)
@@ -30,16 +30,21 @@ reflected_equal (gconstpointer a, gconstpointer b);
 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)
@@ -55,7 +60,7 @@ 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) {
-               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);
@@ -79,7 +84,7 @@ cache_object_handle (MonoDomain *domain, MonoClass *klass, gpointer item, MonoOb
 
        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));
index ee9681e1d27dce1033d9bcbe6b2867327c2f3801..f8e9f37fb49c37774f7aa70a6ce8e5980add9a93 100644 (file)
@@ -143,7 +143,6 @@ mono_class_free_ref_info (MonoClass *klass)
        }
 }
 
-
 /**
  * mono_custom_attrs_free:
  */
@@ -156,7 +155,6 @@ mono_custom_attrs_free (MonoCustomAttrInfo *ainfo)
                g_free (ainfo);
 }
 
-
 gboolean
 reflected_equal (gconstpointer a, gconstpointer b)
 {
@@ -175,7 +173,6 @@ reflected_hash (gconstpointer a) {
        return seed;
 }
 
-
 static void
 clear_cached_object (MonoDomain *domain, gpointer o, MonoClass *klass)
 {
@@ -189,34 +186,28 @@ 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);
-                       FREE_REFENTRY (orig_pe);
+                       free_reflected_entry (orig_pe);
                }
        }
        mono_domain_unlock (domain);
 }
 
-#ifdef REFENTRY_REQUIRES_CLEANUP
 static void
 cleanup_refobject_hash (gpointer key, gpointer value, gpointer user_data)
 {
-       FREE_REFENTRY (key);
+       free_reflected_entry (key);
 }
-#endif
 
 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);
-#endif
                mono_conc_g_hash_table_destroy (domain->refobject_hash);
                domain->refobject_hash = NULL;
        }
 }
 
-
 /**
  * mono_assembly_get_object:
  * \param domain an app domain