Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / reflection-cache.h
index 5799b620e72911127c6e0bf2ebe869a3fb03b7db..bba3cda2d1cf34661a7cfd1f8cdf757fd0845524 100644 (file)
@@ -1,4 +1,5 @@
-/* 
+/**
+ * \file
  * Copyright 2016 Microsoft
  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
@@ -29,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)
@@ -47,16 +53,17 @@ cache_object (MonoDomain *domain, MonoClass *klass, gpointer item, MonoObject* o
        ReflectedEntry pe;
        pe.item = item;
        pe.refclass = klass;
+
        mono_domain_lock (domain);
        if (!domain->refobject_hash)
-               domain->refobject_hash = mono_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table");
+               domain->refobject_hash = mono_conc_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table");
 
-       obj = (MonoObject*) mono_g_hash_table_lookup (domain->refobject_hash, &pe);
+       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_g_hash_table_insert (domain->refobject_hash, e, o);
+               mono_conc_g_hash_table_insert (domain->refobject_hash, e, o);
                obj = o;
        }
        mono_domain_unlock (domain);
@@ -70,16 +77,17 @@ cache_object_handle (MonoDomain *domain, MonoClass *klass, gpointer item, MonoOb
        ReflectedEntry pe;
        pe.item = item;
        pe.refclass = klass;
+
        mono_domain_lock (domain);
        if (!domain->refobject_hash)
-               domain->refobject_hash = mono_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table");
+               domain->refobject_hash = mono_conc_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table");
 
-       MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_g_hash_table_lookup (domain->refobject_hash, &pe));
+       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_g_hash_table_insert (domain->refobject_hash, e, MONO_HANDLE_RAW (o));
+               mono_conc_g_hash_table_insert (domain->refobject_hash, e, MONO_HANDLE_RAW (o));
                MONO_HANDLE_ASSIGN (obj, o);
        }
        mono_domain_unlock (domain);
@@ -87,6 +95,7 @@ cache_object_handle (MonoDomain *domain, MonoClass *klass, gpointer item, MonoOb
 }
 
 #define CACHE_OBJECT(t,p,o,k) ((t) (cache_object (domain, (k), (p), (o))))
+#define CACHE_OBJECT_HANDLE(t,p,o,k) ((t) (cache_object_handle (domain, (k), (p), (o))))
 
 static inline MonoObjectHandle
 check_object_handle (MonoDomain* domain, MonoClass *klass, gpointer item)
@@ -94,11 +103,11 @@ check_object_handle (MonoDomain* domain, MonoClass *klass, gpointer item)
        ReflectedEntry e;
        e.item = item;
        e.refclass = klass;
-       mono_domain_lock (domain);
-       if (!domain->refobject_hash)
-               domain->refobject_hash = mono_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table");
-       MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_g_hash_table_lookup (domain->refobject_hash, &e));
-       mono_domain_unlock (domain);
+       MonoConcGHashTable *hash = domain->refobject_hash;
+       if (!hash)
+               return MONO_HANDLE_NEW (MonoObject, NULL);
+
+       MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_conc_g_hash_table_lookup (hash, &e));
        return obj;
 }
 
@@ -108,12 +117,14 @@ typedef MonoObjectHandle (*ReflectionCacheConstructFunc_handle) (MonoDomain*, Mo
 static inline MonoObjectHandle
 check_or_construct_handle (MonoDomain *domain, MonoClass *klass, gpointer item, gpointer user_data, MonoError *error, ReflectionCacheConstructFunc_handle construct)
 {
-       mono_error_init (error);
+       error_init (error);
        MonoObjectHandle obj = check_object_handle (domain, klass, item);
        if (!MONO_HANDLE_IS_NULL (obj))
                return obj;
        MONO_HANDLE_ASSIGN (obj, construct (domain, klass, item, user_data, error));
        return_val_if_nok (error, NULL);
+       if (MONO_HANDLE_IS_NULL (obj))
+               return obj;
        /* note no caching if there was an error in construction */
        return cache_object_handle (domain, klass, item, obj);
 }