From 28839a2c7cc86f952382de4955395b04e132f1b8 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Mon, 2 Nov 2015 22:08:34 +0200 Subject: [PATCH] [sgen] Remove allow synchronous flag for concurrent collection When concurrent, we always handle evacuating blocks, without the need of a synchronous major collection. --- mcs/class/corlib/Mono/Runtime.cs | 7 +++-- mono/metadata/boehm-gc.c | 5 ---- mono/metadata/gc-internals.h | 4 --- mono/metadata/gc.c | 6 ----- mono/metadata/icall-def.h | 1 - mono/metadata/null-gc.c | 6 ----- mono/metadata/sgen-mono.c | 6 ----- mono/sgen/sgen-gc.c | 46 -------------------------------- mono/sgen/sgen-gc.h | 7 ----- mono/sgen/sgen-marksweep.c | 16 ----------- 10 files changed, 5 insertions(+), 99 deletions(-) diff --git a/mcs/class/corlib/Mono/Runtime.cs b/mcs/class/corlib/Mono/Runtime.cs index 80e56a559ac..7a5f9887c63 100644 --- a/mcs/class/corlib/Mono/Runtime.cs +++ b/mcs/class/corlib/Mono/Runtime.cs @@ -59,7 +59,10 @@ namespace Mono { [MethodImplAttribute (MethodImplOptions.InternalCall)] static extern string GetNativeStackTrace (Exception exception); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern bool SetGCAllowSynchronousMajor (bool flag); + public static bool SetGCAllowSynchronousMajor (bool flag) + { + // No longer used + return true; + } } } diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index 666f6381ebc..c511bff8118 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -1420,11 +1420,6 @@ mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker) return NULL; } -gboolean -mono_gc_set_allow_synchronous_major (gboolean flag) -{ - return flag; -} /* Toggleref support */ void diff --git a/mono/metadata/gc-internals.h b/mono/metadata/gc-internals.h index 465c92b9c6e..3c53082930e 100644 --- a/mono/metadata/gc-internals.h +++ b/mono/metadata/gc-internals.h @@ -80,7 +80,6 @@ gpointer ves_icall_System_GCHandle_GetAddrOfPinnedObject (guint32 handle); void ves_icall_System_GC_register_ephemeron_array (MonoObject *array); MonoObject *ves_icall_System_GC_get_ephemeron_tombstone (void); -MonoBoolean ves_icall_Mono_Runtime_SetGCAllowSynchronousMajor (MonoBoolean flag); extern void mono_gc_init (void); extern void mono_gc_base_init (void); @@ -111,9 +110,6 @@ void mono_gchandle_set_target (guint32 gchandle, MonoObject *obj); /*Ephemeron functionality. Sgen only*/ gboolean mono_gc_ephemeron_array_add (MonoObject *obj); -/* To disable synchronous, evacuating collections - concurrent SGen only */ -gboolean mono_gc_set_allow_synchronous_major (gboolean flag); - MonoBoolean mono_gc_GCHandle_CheckCurrentDomain (guint32 gchandle); diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index 18f3b655cad..61fa63033c9 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -607,12 +607,6 @@ ves_icall_System_GCHandle_GetAddrOfPinnedObject (guint32 handle) return NULL; } -MonoBoolean -ves_icall_Mono_Runtime_SetGCAllowSynchronousMajor (MonoBoolean flag) -{ - return mono_gc_set_allow_synchronous_major (flag); -} - MonoBoolean mono_gc_GCHandle_CheckCurrentDomain (guint32 gchandle) { diff --git a/mono/metadata/icall-def.h b/mono/metadata/icall-def.h index 489b5ded65b..88fb2539e83 100644 --- a/mono/metadata/icall-def.h +++ b/mono/metadata/icall-def.h @@ -46,7 +46,6 @@ ICALL(COMPROX_2, "FindProxy", ves_icall_Mono_Interop_ComInteropProxy_FindProxy) ICALL_TYPE(RUNTIME, "Mono.Runtime", RUNTIME_1) ICALL(RUNTIME_1, "GetDisplayName", ves_icall_Mono_Runtime_GetDisplayName) ICALL(RUNTIME_12, "GetNativeStackTrace", ves_icall_Mono_Runtime_GetNativeStackTrace) -ICALL(RUNTIME_13, "SetGCAllowSynchronousMajor", ves_icall_Mono_Runtime_SetGCAllowSynchronousMajor) #ifndef PLATFORM_RO_FS ICALL_TYPE(KPAIR, "Mono.Security.Cryptography.KeyPairPersistence", KPAIR_1) diff --git a/mono/metadata/null-gc.c b/mono/metadata/null-gc.c index 773410ad7b6..e5c16e1e9a4 100644 --- a/mono/metadata/null-gc.c +++ b/mono/metadata/null-gc.c @@ -528,12 +528,6 @@ mono_gc_register_altstack (gpointer stack, gint32 stack_size, gpointer altstack, { } -gboolean -mono_gc_set_allow_synchronous_major (gboolean flag) -{ - return TRUE; -} - gboolean mono_gc_is_null (void) { diff --git a/mono/metadata/sgen-mono.c b/mono/metadata/sgen-mono.c index 2783e1af8fa..3ab15956480 100644 --- a/mono/metadata/sgen-mono.c +++ b/mono/metadata/sgen-mono.c @@ -2687,12 +2687,6 @@ sgen_client_ensure_weak_gchandles_accessible (void) mono_gc_wait_for_bridge_processing (); } -gboolean -mono_gc_set_allow_synchronous_major (gboolean flag) -{ - return sgen_set_allow_synchronous_major (flag); -} - void* mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data) { diff --git a/mono/sgen/sgen-gc.c b/mono/sgen/sgen-gc.c index 865916a3b88..4ffceb8390e 100644 --- a/mono/sgen/sgen-gc.c +++ b/mono/sgen/sgen-gc.c @@ -239,12 +239,6 @@ static gboolean do_concurrent_checks = FALSE; each collection */ static gboolean do_scan_starts_check = FALSE; -/* - * If the major collector is concurrent and this is FALSE, we will - * never initiate a synchronous major collection, unless requested via - * GC.Collect(). - */ -static gboolean allow_synchronous_major = TRUE; static gboolean disable_minor_collections = FALSE; static gboolean disable_major_collections = FALSE; static gboolean do_verify_nursery = FALSE; @@ -2244,17 +2238,6 @@ sgen_perform_collection (size_t requested_size, int generation_to_collect, const goto done; } - /* - * If we've been asked to do a major collection, and the major collector wants to - * run synchronously (to evacuate), we set the flag to do that. - */ - if (generation_to_collect == GENERATION_OLD && - allow_synchronous_major && - major_collector.want_synchronous_collection && - *major_collector.want_synchronous_collection) { - wait_to_finish = TRUE; - } - SGEN_ASSERT (0, !concurrent_collection_in_progress, "Why did this not get handled above?"); /* @@ -2726,16 +2709,6 @@ sgen_gc_get_used_size (void) return tot; } -gboolean -sgen_set_allow_synchronous_major (gboolean flag) -{ - if (!major_collector.is_concurrent) - return flag; - - allow_synchronous_major = flag; - return TRUE; -} - void sgen_env_var_error (const char *env_var, const char *fallback, const char *description_format, ...) { @@ -2952,23 +2925,6 @@ sgen_gc_init (void) } continue; } - if (g_str_has_prefix (opt, "allow-synchronous-major=")) { - if (!major_collector.is_concurrent) { - sgen_env_var_error (MONO_GC_PARAMS_NAME, "Ignoring.", "`allow-synchronous-major` is only valid for the concurrent major collector."); - continue; - } - - opt = strchr (opt, '=') + 1; - - if (!strcmp (opt, "yes")) { - allow_synchronous_major = TRUE; - } else if (!strcmp (opt, "no")) { - allow_synchronous_major = FALSE; - } else { - sgen_env_var_error (MONO_GC_PARAMS_NAME, "Using default value.", "`allow-synchronous-major` must be either `yes' or `no'."); - continue; - } - } if (!strcmp (opt, "cementing")) { cement_enabled = TRUE; @@ -3001,8 +2957,6 @@ sgen_gc_init (void) fprintf (stderr, " minor=COLLECTOR (where COLLECTOR is `simple' or `split')\n"); fprintf (stderr, " wbarrier=WBARRIER (where WBARRIER is `remset' or `cardtable')\n"); fprintf (stderr, " [no-]cementing\n"); - if (major_collector.is_concurrent) - fprintf (stderr, " allow-synchronous-major=FLAG (where FLAG is `yes' or `no')\n"); if (major_collector.print_gc_param_usage) major_collector.print_gc_param_usage (); if (sgen_minor_collector.print_gc_param_usage) diff --git a/mono/sgen/sgen-gc.h b/mono/sgen/sgen-gc.h index b7e1b68e0c7..d47a978a619 100644 --- a/mono/sgen/sgen-gc.h +++ b/mono/sgen/sgen-gc.h @@ -607,13 +607,6 @@ struct _SgenMajorCollector { gboolean supports_cardtable; gboolean sweeps_lazily; - /* - * This is set to TRUE by the sweep if the next major - * collection should be synchronous (for evacuation). For - * non-concurrent collectors, this should be NULL. - */ - gboolean *want_synchronous_collection; - void* (*alloc_heap) (mword nursery_size, mword nursery_align, int nursery_bits); gboolean (*is_object_live) (GCObject *obj); GCObject* (*alloc_small_pinned_obj) (GCVTable vtable, size_t size, gboolean has_references); diff --git a/mono/sgen/sgen-marksweep.c b/mono/sgen/sgen-marksweep.c index 39e49d206ad..2be1cc4e01a 100644 --- a/mono/sgen/sgen-marksweep.c +++ b/mono/sgen/sgen-marksweep.c @@ -170,8 +170,6 @@ static int fast_block_obj_size_indexes [MS_NUM_FAST_BLOCK_OBJ_SIZE_INDEXES]; static gboolean *evacuate_block_obj_sizes; static float evacuation_threshold = 0.666f; -static float concurrent_evacuation_threshold = 0.666f; -static gboolean want_evacuation = FALSE; static gboolean lazy_sweep = FALSE; @@ -1620,8 +1618,6 @@ sweep_job_func (void *thread_data_untyped, SgenThreadPoolJob *job) static void sweep_finish (void) { - mword total_evacuate_heap = 0; - mword total_evacuate_saved = 0; int i; for (i = 0; i < num_block_obj_sizes; ++i) { @@ -1635,16 +1631,8 @@ sweep_finish (void) } else { evacuate_block_obj_sizes [i] = FALSE; } - { - mword total_bytes = block_obj_sizes [i] * sweep_slots_available [i]; - total_evacuate_heap += total_bytes; - if (evacuate_block_obj_sizes [i]) - total_evacuate_saved += total_bytes - block_obj_sizes [i] * sweep_slots_used [i]; - } } - want_evacuation = (float)total_evacuate_saved / (float)total_evacuate_heap > (1 - concurrent_evacuation_threshold); - set_sweep_state (SWEEP_STATE_SWEPT, SWEEP_STATE_COMPACTING); } @@ -2433,10 +2421,6 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr concurrent_mark = is_concurrent; collector->is_concurrent = is_concurrent; collector->needs_thread_pool = is_concurrent || concurrent_sweep; - if (is_concurrent) - collector->want_synchronous_collection = &want_evacuation; - else - collector->want_synchronous_collection = NULL; collector->get_and_reset_num_major_objects_marked = major_get_and_reset_num_major_objects_marked; collector->supports_cardtable = TRUE; -- 2.25.1