From 0f3e228ceacfb39f60f8374dbc03935b3d1a2650 Mon Sep 17 00:00:00 2001 From: Jonas Echterhoff Date: Wed, 25 Sep 2019 07:56:30 +0200 Subject: [PATCH 1/3] Split mono_gc_is_moving and mono_gc_is_incremental --- mono/metadata/boehm-gc.c | 4 ---- mono/metadata/domain.c | 8 +++----- mono/metadata/gc-internals.h | 8 ++++---- mono/metadata/marshal.c | 10 +++++----- mono/metadata/object.c | 8 ++++---- mono/metadata/reflection-cache.h | 4 ++-- mono/metadata/threads.c | 4 ---- mono/mini/aot-compiler.c | 2 +- mono/mini/aot-runtime.c | 6 +++--- mono/mini/debugger-agent.c | 4 ++-- mono/mini/mini-gc.c | 2 +- mono/mini/tasklets.c | 2 +- 12 files changed, 26 insertions(+), 36 deletions(-) diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index da229ea1aff5..54eea4184132 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -1577,11 +1577,7 @@ mono_gc_set_desktop_mode (void) gboolean mono_gc_is_moving (void) { -#if HAVE_BDWGC_GC - return GC_is_incremental_mode (); -#else return FALSE; -#endif } gboolean diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index 84b99dfde02b..f309b1b47028 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -296,7 +296,7 @@ mono_ptrarray_hash (gpointer *s) static void* gc_alloc_fixed_non_heap_list (size_t size) { - if (mono_gc_is_moving ()) + if (mono_gc_is_moving () || mono_gc_is_incremental()) return g_malloc0 (size); else return mono_gc_alloc_fixed (size, MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain List"); @@ -305,7 +305,7 @@ gc_alloc_fixed_non_heap_list (size_t size) static void gc_free_fixed_non_heap_list (void *ptr) { - if (mono_gc_is_moving ()) + if (mono_gc_is_moving () || mono_gc_is_incremental()) g_free (ptr); else mono_gc_free_fixed (ptr); @@ -405,7 +405,7 @@ mono_domain_create (void) } mono_appdomains_unlock (); - if (!mono_gc_is_moving ()) + if (!(mono_gc_is_moving () || mono_gc_is_incremental())) domain = (MonoDomain *)mono_gc_alloc_fixed (sizeof (MonoDomain), MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain Structure"); else domain = (MonoDomain *)mono_gc_alloc_fixed (sizeof (MonoDomain), domain_gc_desc, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain Structure"); @@ -1252,12 +1252,10 @@ mono_domain_free (MonoDomain *domain, gboolean force) domain->setup = NULL; -#if !HAVE_BDWGC_GC // This crashes in bdwgc because we never register such a root. // Not sure why/how it works in sgen, or if it is needed? if (mono_gc_is_moving ()) mono_gc_deregister_root ((char*)&(domain->MONO_DOMAIN_FIRST_GC_TRACKED)); -#endif mono_appdomains_lock (); appdomains_list [domain->domain_id] = NULL; diff --git a/mono/metadata/gc-internals.h b/mono/metadata/gc-internals.h index 22f556eafee9..562b11b9e65d 100644 --- a/mono/metadata/gc-internals.h +++ b/mono/metadata/gc-internals.h @@ -31,7 +31,7 @@ * by mono_gc_alloc_fixed (). */ /* For SGEN, the result of alloc_fixed () is not GC tracked memory */ -#define MONO_GC_ROOT_DESCR_FOR_FIXED(n) (mono_gc_is_moving () ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL) +#define MONO_GC_ROOT_DESCR_FOR_FIXED(n) ((mono_gc_is_moving () || mono_gc_is_incremental()) ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL) /* Register a memory location holding a single object reference as a GC root */ #define MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg) do { \ @@ -44,17 +44,17 @@ * when using Boehm. */ #define MONO_GC_REGISTER_ROOT_IF_MOVING(x,src,key,msg) do { \ - if (mono_gc_is_moving ()) \ + if ((mono_gc_is_moving () || mono_gc_is_incremental())) \ MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg); \ } while (0) #define MONO_GC_UNREGISTER_ROOT_IF_MOVING(x) do { \ - if (mono_gc_is_moving ()) \ + if ((mono_gc_is_moving () || mono_gc_is_incremental())) \ MONO_GC_UNREGISTER_ROOT (x); \ } while (0) /* useful until we keep track of gc-references in corlib etc. */ -#define IS_GC_REFERENCE(class,t) (mono_gc_is_moving () ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib)) +#define IS_GC_REFERENCE(class,t) ((mono_gc_is_moving () || mono_gc_is_incremental()) ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib)) void mono_object_register_finalizer (MonoObject *obj); void ves_icall_System_GC_InternalCollect (int generation); diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index a04dd075a8f6..147aa075a910 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -535,11 +535,11 @@ delegate_hash_table_remove (MonoDelegate *d) mono_marshal_lock (); if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); - if (mono_gc_is_moving ()) + if ((mono_gc_is_moving () || mono_gc_is_incremental())) gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, d->delegate_trampoline)); g_hash_table_remove (delegate_hash_table, d->delegate_trampoline); mono_marshal_unlock (); - if (gchandle && mono_gc_is_moving ()) + if (gchandle && (mono_gc_is_moving () || mono_gc_is_incremental())) mono_gchandle_free (gchandle); } @@ -553,7 +553,7 @@ delegate_hash_table_add (MonoDelegateHandle d) if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); gpointer delegate_trampoline = MONO_HANDLE_GETVAL (d, delegate_trampoline); - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { gchandle = mono_gchandle_new_weakref ((MonoObject*) MONO_HANDLE_RAW (d), FALSE); old_gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, delegate_trampoline)); g_hash_table_insert (delegate_hash_table, delegate_trampoline, GUINT_TO_POINTER (gchandle)); @@ -636,7 +636,7 @@ mono_ftnptr_to_delegate_handle (MonoClass *klass, gpointer ftn, MonoError *error if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, ftn)); mono_marshal_unlock (); if (gchandle) @@ -4053,7 +4053,7 @@ emit_invoke_call (MonoMethodBuilder *mb, MonoMethod *method, if (sig->hasthis) { if (string_ctor) { - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { mono_mb_emit_ptr (mb, &string_dummy); mono_mb_emit_byte (mb, CEE_LDIND_REF); } else { diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 478b73b2747a..59804840d3b4 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -760,7 +760,7 @@ compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int } /* An Ephemeron cannot be marked by sgen */ - if (mono_gc_is_moving () && !static_fields && klass->image == mono_defaults.corlib && !strcmp ("Ephemeron", klass->name)) { + if ((mono_gc_is_moving () || mono_gc_is_incremental()) && !static_fields && klass->image == mono_defaults.corlib && !strcmp ("Ephemeron", klass->name)) { *max_set = 0; memset (bitmap, 0, size / 8); return bitmap; @@ -5703,7 +5703,7 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest) static void array_full_copy_unchecked_size (MonoArray *src, MonoArray *dest, MonoClass *klass, uintptr_t size) { - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { if (klass->element_class->valuetype) { if (klass->element_class->has_references) mono_value_copy_array (dest, 0, mono_array_addr_with_size_fast (src, 0, 0), mono_array_length (src)); @@ -6447,7 +6447,7 @@ mono_value_box_checked (MonoDomain *domain, MonoClass *klass, gpointer value, Mo size = size - sizeof (MonoObject); - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { g_assert (size == mono_class_value_size (klass, NULL)); mono_gc_wbarrier_value_copy ((char *)res + sizeof (MonoObject), value, 1, klass); } else { @@ -6810,7 +6810,7 @@ mono_string_get_pinned (MonoString *str, MonoError *error) error_init (error); /* We only need to make a pinned version of a string if this is a moving GC */ - if (!mono_gc_is_moving ()) + if (!(mono_gc_is_moving () || mono_gc_is_incremental())) return str; int size; MonoString *news; diff --git a/mono/metadata/reflection-cache.h b/mono/metadata/reflection-cache.h index 9fd05486f247..313e7dc34013 100644 --- a/mono/metadata/reflection-cache.h +++ b/mono/metadata/reflection-cache.h @@ -33,7 +33,7 @@ reflected_hash (gconstpointer a); static inline ReflectedEntry* alloc_reflected_entry (MonoDomain *domain) { - if (!mono_gc_is_moving ()) + if (!(mono_gc_is_moving () || mono_gc_is_incremental())) return g_new0 (ReflectedEntry, 1); else return (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry)); @@ -42,7 +42,7 @@ alloc_reflected_entry (MonoDomain *domain) static void free_reflected_entry (ReflectedEntry *entry) { - if (!mono_gc_is_moving ()) + if (!(mono_gc_is_moving () || mono_gc_is_incremental())) g_free (entry); } diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index c4cfcc80b8ce..85b9e17e3f93 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -566,12 +566,10 @@ create_internal_thread_object (void) * Boehm incremental is not actually "moving", it does not need the thread_pinning_ref. * But having it causes problems when unregistering the root after domain reload. */ -#if !defined(HAVE_BOEHM_GC) if (mono_gc_is_moving ()) { thread->thread_pinning_ref = thread; MONO_GC_REGISTER_ROOT_PINNING (thread->thread_pinning_ref, MONO_ROOT_SOURCE_THREADING, NULL, "Thread Pinning Reference"); } -#endif thread->priority = MONO_THREAD_PRIORITY_NORMAL; @@ -894,12 +892,10 @@ mono_thread_detach_internal (MonoInternalThread *thread) * Boehm incremental is not actually "moving", it does not need the thread_pinning_ref. * But having it causes problems when unregistering the root after domain reload. */ -#if !defined(HAVE_BOEHM_GC) if (mono_gc_is_moving ()) { MONO_GC_UNREGISTER_ROOT (thread->thread_pinning_ref); thread->thread_pinning_ref = NULL; } -#endif done: SET_CURRENT_OBJECT (NULL); diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index cd6627f9a22c..a8519841ec58 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -4111,7 +4111,7 @@ add_wrappers (MonoAotCompile *acfg) } /* write barriers */ - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { add_method (acfg, mono_gc_get_specific_write_barrier (FALSE)); add_method (acfg, mono_gc_get_specific_write_barrier (TRUE)); } diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index baa8be474684..3db65ec73203 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -1899,11 +1899,11 @@ init_amodule_got (MonoAotModule *amodule) for (i = 0; i < npatches; ++i) { ji = &patches [i]; - if (ji->type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR && !mono_gc_is_moving ()) { + if (ji->type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR && !(mono_gc_is_moving () || mono_gc_is_incremental())) { amodule->shared_got [i] = NULL; - } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_START && !mono_gc_is_moving ()) { + } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_START && !(mono_gc_is_moving () || mono_gc_is_incremental())) { amodule->shared_got [i] = NULL; - } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_BITS && !mono_gc_is_moving ()) { + } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_BITS && !(mono_gc_is_moving () || mono_gc_is_incremental())) { amodule->shared_got [i] = NULL; } else if (ji->type == MONO_PATCH_INFO_IMAGE) { amodule->shared_got [i] = amodule->assembly->image; diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 995b38f75f68..3839db8bf301 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -2204,7 +2204,7 @@ get_objref (MonoObject *obj) /* FIXME: The tables can grow indefinitely */ - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { /* * Objects can move, so use a hash table mapping hash codes to lists of * ObjRef structures. @@ -2235,7 +2235,7 @@ get_objref (MonoObject *obj) g_hash_table_insert (objrefs, GINT_TO_POINTER (ref->id), ref); - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { reflist = g_slist_append (reflist, ref); g_hash_table_insert (obj_to_objref, GINT_TO_POINTER (hash), reflist); } else { diff --git a/mono/mini/mini-gc.c b/mono/mini/mini-gc.c index b21dd1be3202..8a0d7f147a9c 100644 --- a/mono/mini/mini-gc.c +++ b/mono/mini/mini-gc.c @@ -2627,7 +2627,7 @@ mini_gc_set_slot_type_from_cfa (MonoCompile *cfg, int slot_offset, GCSlotType ty void mini_gc_init_cfg (MonoCompile *cfg) { - if (mono_gc_is_moving ()) { + if ((mono_gc_is_moving () || mono_gc_is_incremental())) { cfg->disable_ref_noref_stack_slot_share = TRUE; cfg->gen_write_barriers = TRUE; } diff --git a/mono/mini/tasklets.c b/mono/mini/tasklets.c index 9ade74f6df36..4bf4b6d86f78 100644 --- a/mono/mini/tasklets.c +++ b/mono/mini/tasklets.c @@ -19,7 +19,7 @@ static mono_mutex_t tasklets_mutex; static void internal_init (void) { - if (!mono_gc_is_moving ()) + if (!(mono_gc_is_moving () || mono_gc_is_incremental())) /* Boehm requires the keepalive stacks to be kept in a hash since mono_gc_alloc_fixed () returns GC memory */ g_assert_not_reached (); } From 10055c98127076d7bb793df00e1794c3246d9cd7 Mon Sep 17 00:00:00 2001 From: Jonas Echterhoff Date: Wed, 25 Sep 2019 08:53:33 +0200 Subject: [PATCH 2/3] more moving changes --- mono/metadata/domain.c | 6 +++--- mono/metadata/gc-internals.h | 6 +++--- mono/metadata/marshal.c | 10 +++++----- mono/metadata/object.c | 6 +++--- mono/metadata/reflection-cache.h | 4 ++-- mono/mini/aot-runtime.c | 6 +++--- mono/mini/debugger-agent.c | 4 ++-- mono/mini/tasklets.c | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index f309b1b47028..4292fb7f7bdc 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -296,7 +296,7 @@ mono_ptrarray_hash (gpointer *s) static void* gc_alloc_fixed_non_heap_list (size_t size) { - if (mono_gc_is_moving () || mono_gc_is_incremental()) + if (mono_gc_is_moving ()) return g_malloc0 (size); else return mono_gc_alloc_fixed (size, MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain List"); @@ -305,7 +305,7 @@ gc_alloc_fixed_non_heap_list (size_t size) static void gc_free_fixed_non_heap_list (void *ptr) { - if (mono_gc_is_moving () || mono_gc_is_incremental()) + if (mono_gc_is_moving ()) g_free (ptr); else mono_gc_free_fixed (ptr); @@ -405,7 +405,7 @@ mono_domain_create (void) } mono_appdomains_unlock (); - if (!(mono_gc_is_moving () || mono_gc_is_incremental())) + if (!mono_gc_is_moving ()) domain = (MonoDomain *)mono_gc_alloc_fixed (sizeof (MonoDomain), MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain Structure"); else domain = (MonoDomain *)mono_gc_alloc_fixed (sizeof (MonoDomain), domain_gc_desc, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain Structure"); diff --git a/mono/metadata/gc-internals.h b/mono/metadata/gc-internals.h index 562b11b9e65d..5704f9dfc3ec 100644 --- a/mono/metadata/gc-internals.h +++ b/mono/metadata/gc-internals.h @@ -31,7 +31,7 @@ * by mono_gc_alloc_fixed (). */ /* For SGEN, the result of alloc_fixed () is not GC tracked memory */ -#define MONO_GC_ROOT_DESCR_FOR_FIXED(n) ((mono_gc_is_moving () || mono_gc_is_incremental()) ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL) +#define MONO_GC_ROOT_DESCR_FOR_FIXED(n) (mono_gc_is_moving () ? mono_gc_make_root_descr_all_refs (0) : MONO_GC_DESCRIPTOR_NULL) /* Register a memory location holding a single object reference as a GC root */ #define MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg) do { \ @@ -44,12 +44,12 @@ * when using Boehm. */ #define MONO_GC_REGISTER_ROOT_IF_MOVING(x,src,key,msg) do { \ - if ((mono_gc_is_moving () || mono_gc_is_incremental())) \ + if (mono_gc_is_moving ()) \ MONO_GC_REGISTER_ROOT_SINGLE(x,src,key,msg); \ } while (0) #define MONO_GC_UNREGISTER_ROOT_IF_MOVING(x) do { \ - if ((mono_gc_is_moving () || mono_gc_is_incremental())) \ + if (mono_gc_is_moving ()) \ MONO_GC_UNREGISTER_ROOT (x); \ } while (0) diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 147aa075a910..a04dd075a8f6 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -535,11 +535,11 @@ delegate_hash_table_remove (MonoDelegate *d) mono_marshal_lock (); if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); - if ((mono_gc_is_moving () || mono_gc_is_incremental())) + if (mono_gc_is_moving ()) gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, d->delegate_trampoline)); g_hash_table_remove (delegate_hash_table, d->delegate_trampoline); mono_marshal_unlock (); - if (gchandle && (mono_gc_is_moving () || mono_gc_is_incremental())) + if (gchandle && mono_gc_is_moving ()) mono_gchandle_free (gchandle); } @@ -553,7 +553,7 @@ delegate_hash_table_add (MonoDelegateHandle d) if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); gpointer delegate_trampoline = MONO_HANDLE_GETVAL (d, delegate_trampoline); - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving ()) { gchandle = mono_gchandle_new_weakref ((MonoObject*) MONO_HANDLE_RAW (d), FALSE); old_gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, delegate_trampoline)); g_hash_table_insert (delegate_hash_table, delegate_trampoline, GUINT_TO_POINTER (gchandle)); @@ -636,7 +636,7 @@ mono_ftnptr_to_delegate_handle (MonoClass *klass, gpointer ftn, MonoError *error if (delegate_hash_table == NULL) delegate_hash_table = delegate_hash_table_new (); - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving ()) { gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (delegate_hash_table, ftn)); mono_marshal_unlock (); if (gchandle) @@ -4053,7 +4053,7 @@ emit_invoke_call (MonoMethodBuilder *mb, MonoMethod *method, if (sig->hasthis) { if (string_ctor) { - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving ()) { mono_mb_emit_ptr (mb, &string_dummy); mono_mb_emit_byte (mb, CEE_LDIND_REF); } else { diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 59804840d3b4..78ad44877b02 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -760,7 +760,7 @@ compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int } /* An Ephemeron cannot be marked by sgen */ - if ((mono_gc_is_moving () || mono_gc_is_incremental()) && !static_fields && klass->image == mono_defaults.corlib && !strcmp ("Ephemeron", klass->name)) { + if (mono_gc_is_moving () && !static_fields && klass->image == mono_defaults.corlib && !strcmp ("Ephemeron", klass->name)) { *max_set = 0; memset (bitmap, 0, size / 8); return bitmap; @@ -5703,7 +5703,7 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest) static void array_full_copy_unchecked_size (MonoArray *src, MonoArray *dest, MonoClass *klass, uintptr_t size) { - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving () || mono_gc_is_incremental()) { if (klass->element_class->valuetype) { if (klass->element_class->has_references) mono_value_copy_array (dest, 0, mono_array_addr_with_size_fast (src, 0, 0), mono_array_length (src)); @@ -6810,7 +6810,7 @@ mono_string_get_pinned (MonoString *str, MonoError *error) error_init (error); /* We only need to make a pinned version of a string if this is a moving GC */ - if (!(mono_gc_is_moving () || mono_gc_is_incremental())) + if (!mono_gc_is_moving ()) return str; int size; MonoString *news; diff --git a/mono/metadata/reflection-cache.h b/mono/metadata/reflection-cache.h index 313e7dc34013..9fd05486f247 100644 --- a/mono/metadata/reflection-cache.h +++ b/mono/metadata/reflection-cache.h @@ -33,7 +33,7 @@ reflected_hash (gconstpointer a); static inline ReflectedEntry* alloc_reflected_entry (MonoDomain *domain) { - if (!(mono_gc_is_moving () || mono_gc_is_incremental())) + if (!mono_gc_is_moving ()) return g_new0 (ReflectedEntry, 1); else return (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry)); @@ -42,7 +42,7 @@ alloc_reflected_entry (MonoDomain *domain) static void free_reflected_entry (ReflectedEntry *entry) { - if (!(mono_gc_is_moving () || mono_gc_is_incremental())) + if (!mono_gc_is_moving ()) g_free (entry); } diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index 3db65ec73203..baa8be474684 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -1899,11 +1899,11 @@ init_amodule_got (MonoAotModule *amodule) for (i = 0; i < npatches; ++i) { ji = &patches [i]; - if (ji->type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR && !(mono_gc_is_moving () || mono_gc_is_incremental())) { + if (ji->type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR && !mono_gc_is_moving ()) { amodule->shared_got [i] = NULL; - } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_START && !(mono_gc_is_moving () || mono_gc_is_incremental())) { + } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_START && !mono_gc_is_moving ()) { amodule->shared_got [i] = NULL; - } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_BITS && !(mono_gc_is_moving () || mono_gc_is_incremental())) { + } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_BITS && !mono_gc_is_moving ()) { amodule->shared_got [i] = NULL; } else if (ji->type == MONO_PATCH_INFO_IMAGE) { amodule->shared_got [i] = amodule->assembly->image; diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 3839db8bf301..995b38f75f68 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -2204,7 +2204,7 @@ get_objref (MonoObject *obj) /* FIXME: The tables can grow indefinitely */ - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving ()) { /* * Objects can move, so use a hash table mapping hash codes to lists of * ObjRef structures. @@ -2235,7 +2235,7 @@ get_objref (MonoObject *obj) g_hash_table_insert (objrefs, GINT_TO_POINTER (ref->id), ref); - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_is_moving ()) { reflist = g_slist_append (reflist, ref); g_hash_table_insert (obj_to_objref, GINT_TO_POINTER (hash), reflist); } else { diff --git a/mono/mini/tasklets.c b/mono/mini/tasklets.c index 4bf4b6d86f78..9ade74f6df36 100644 --- a/mono/mini/tasklets.c +++ b/mono/mini/tasklets.c @@ -19,7 +19,7 @@ static mono_mutex_t tasklets_mutex; static void internal_init (void) { - if (!(mono_gc_is_moving () || mono_gc_is_incremental())) + if (!mono_gc_is_moving ()) /* Boehm requires the keepalive stacks to be kept in a hash since mono_gc_alloc_fixed () returns GC memory */ g_assert_not_reached (); } From 5d0fe484ecd3be78c68c409d7082270c89d0732d Mon Sep 17 00:00:00 2001 From: Jonas Echterhoff Date: Thu, 26 Sep 2019 08:57:26 +0200 Subject: [PATCH 3/3] Add an explicit mono_gc_needs_write_barriers to check for --- mono/metadata/boehm-gc.c | 10 ++++++++++ mono/metadata/gc-internals.h | 7 ++++++- mono/metadata/null-gc.c | 6 ++++++ mono/metadata/object.c | 4 ++-- mono/metadata/sgen-mono.c | 6 ++++++ mono/mini/aot-compiler.c | 2 +- mono/mini/mini-gc.c | 2 +- 7 files changed, 32 insertions(+), 5 deletions(-) diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index 54eea4184132..c8878b456cf9 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -1580,6 +1580,16 @@ mono_gc_is_moving (void) return FALSE; } +gboolean +mono_gc_needs_write_barriers(void) +{ +#if HAVE_BDWGC_GC + return GC_is_incremental_mode(); +#else + return FALSE; +#endif +} + gboolean mono_gc_is_disabled (void) { diff --git a/mono/metadata/gc-internals.h b/mono/metadata/gc-internals.h index 5704f9dfc3ec..50665278ff7d 100644 --- a/mono/metadata/gc-internals.h +++ b/mono/metadata/gc-internals.h @@ -54,7 +54,7 @@ } while (0) /* useful until we keep track of gc-references in corlib etc. */ -#define IS_GC_REFERENCE(class,t) ((mono_gc_is_moving () || mono_gc_is_incremental()) ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib)) +#define IS_GC_REFERENCE(class,t) (mono_gc_needs_write_barriers() ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib)) void mono_object_register_finalizer (MonoObject *obj); void ves_icall_System_GC_InternalCollect (int generation); @@ -280,6 +280,11 @@ void mono_gc_set_desktop_mode (void); */ gboolean mono_gc_is_moving (void); +/* + * Return whenever this GC needs write barriers + */ +gboolean mono_gc_needs_write_barriers (void); + typedef void* (*MonoGCLockedCallbackFunc) (void *data); void* mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data); diff --git a/mono/metadata/null-gc.c b/mono/metadata/null-gc.c index 18f66cbdfa06..b95ffa4e29d3 100644 --- a/mono/metadata/null-gc.c +++ b/mono/metadata/null-gc.c @@ -430,6 +430,12 @@ mono_gc_is_moving (void) return FALSE; } +gboolean +mono_gc_needs_write_barriers(void) +{ + return FALSE; +} + gboolean mono_gc_is_disabled (void) { diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 78ad44877b02..6f0d4c03cc21 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -5703,7 +5703,7 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest) static void array_full_copy_unchecked_size (MonoArray *src, MonoArray *dest, MonoClass *klass, uintptr_t size) { - if (mono_gc_is_moving () || mono_gc_is_incremental()) { + if (mono_gc_needs_write_barriers()) { if (klass->element_class->valuetype) { if (klass->element_class->has_references) mono_value_copy_array (dest, 0, mono_array_addr_with_size_fast (src, 0, 0), mono_array_length (src)); @@ -6447,7 +6447,7 @@ mono_value_box_checked (MonoDomain *domain, MonoClass *klass, gpointer value, Mo size = size - sizeof (MonoObject); - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_needs_write_barriers()) { g_assert (size == mono_class_value_size (klass, NULL)); mono_gc_wbarrier_value_copy ((char *)res + sizeof (MonoObject), value, 1, klass); } else { diff --git a/mono/metadata/sgen-mono.c b/mono/metadata/sgen-mono.c index fb975c75e7d5..98197c1ca805 100644 --- a/mono/metadata/sgen-mono.c +++ b/mono/metadata/sgen-mono.c @@ -2782,6 +2782,12 @@ mono_gc_is_moving (void) return TRUE; } +gboolean +mono_gc_needs_write_barriers(void) +{ + return TRUE; +} + gboolean mono_gc_is_disabled (void) { diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index a8519841ec58..07ef2b70b859 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -4111,7 +4111,7 @@ add_wrappers (MonoAotCompile *acfg) } /* write barriers */ - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_needs_write_barriers()) { add_method (acfg, mono_gc_get_specific_write_barrier (FALSE)); add_method (acfg, mono_gc_get_specific_write_barrier (TRUE)); } diff --git a/mono/mini/mini-gc.c b/mono/mini/mini-gc.c index 8a0d7f147a9c..fdafb9f03c82 100644 --- a/mono/mini/mini-gc.c +++ b/mono/mini/mini-gc.c @@ -2627,7 +2627,7 @@ mini_gc_set_slot_type_from_cfa (MonoCompile *cfg, int slot_offset, GCSlotType ty void mini_gc_init_cfg (MonoCompile *cfg) { - if ((mono_gc_is_moving () || mono_gc_is_incremental())) { + if (mono_gc_needs_write_barriers()) { cfg->disable_ref_noref_stack_slot_share = TRUE; cfg->gen_write_barriers = TRUE; }