From e732965529ce3b29de2d211349c033f4b5724a23 Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 16 Aug 2024 08:28:35 +0200 Subject: [PATCH 2/4] Add gen_params to igc_params. * src/igc.h (struct igc_gen_param): New. (struct igc_params): Add gen_params field. * src/emacs.c (parse_igc_gen_params): New. (parse_igc_param): Use it. * src/igc.c (make_arena): Use igc_params to configure the generation chain. --- src/emacs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/igc.c | 11 +++++++++-- src/igc.h | 12 ++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/emacs.c b/src/emacs.c index ced3f723919..b2d12b61967 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -736,6 +736,45 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr, } #ifdef HAVE_MPS +static void +parse_igc_gen_params (const char *string, struct igc_params *params) +{ + size_t count = 0; + struct igc_gen_param *array = NULL; + for (const char *s = string;;) + { + int n = 0; + size_t capacity, mortality; + if ((sscanf (s, "%zuk%zu%%%n", &capacity, &mortality, &n) == 2) + && mortality <= 100) + { + struct igc_gen_param p = { .capacity = capacity, + .mortality = (double)mortality / 100.0 }; + count++; + array = xrealloc (array, sizeof (array[0]) * count); + array[count - 1] = p; + if (s[n] == ',') + { + s = &s[n + 1]; + continue; + } + else if (s[n] == '\0') + { + params->gen_params.dflt = false; + params->gen_params.gen_count = count; + params->gen_params.gen_params = array; + return; + } + else + break; + } + else + break; + } + fprintf (stderr, "Invalid value gen_params: %s\n", string); + exit (1); +} + static void parse_igc_param (const char *val, struct igc_params *params) { @@ -746,6 +785,11 @@ parse_igc_param (const char *val, struct igc_params *params) params->pause_time.dflt = false; return; } + + const char *key = "gen_params="; + if (strncmp (val, key, strlen (key)) == 0) + return parse_igc_gen_params (val + strlen (key), params); + fprintf (stderr, "Invalid igc_param: %s\n", val); exit (1); } diff --git a/src/igc.c b/src/igc.c index c294eae747e..77f897bfdca 100644 --- a/src/igc.c +++ b/src/igc.c @@ -4463,8 +4463,15 @@ make_arena (struct igc *gc, const struct igc_params *params) MPS_ARGS_END (args); IGC_CHECK_RES (res); - mps_gen_param_s gens[] = { { 128000, 0.8 }, { 5 * 128000, 0.4 } }; - res = mps_chain_create (&gc->chain, gc->arena, ARRAYELTS (gens), gens); + mps_gen_param_s dflt_gens[] = { { 128000, 0.8 }, { 5 * 128000, 0.4 } }; + mps_gen_param_s *gens = dflt_gens; + size_t ngens = ARRAYELTS (dflt_gens); + if (!params->gen_params.dflt) + { + ngens = params->gen_params.gen_count; + gens = (mps_gen_param_s *)params->gen_params.gen_params; + } + res = mps_chain_create (&gc->chain, gc->arena, ngens, gens); IGC_CHECK_RES (res); } diff --git a/src/igc.h b/src/igc.h index 586db8ce77f..716069adceb 100644 --- a/src/igc.h +++ b/src/igc.h @@ -60,6 +60,12 @@ #define EMACS_IGC_H #ifdef HAVE_MPS +struct igc_gen_param +{ + size_t capacity; /* in kilobytes */ + double mortality; /* initial estimate; valid values in [0..1] */ +}; + struct igc_params { struct @@ -67,6 +73,12 @@ #define EMACS_IGC_H bool dflt; double seconds; /* in seconds; valid values in [0..INF] */ } pause_time; + struct + { + bool dflt; + size_t gen_count; + struct igc_gen_param *gen_params; + } gen_params; }; void igc_break (void); -- 2.39.2