From 63010af19ff11e77aee0846e7b795cc4df897f4a Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 16 Aug 2024 08:21:25 +0200 Subject: [PATCH 1/4] Introduce a struct igc_params * src/igc.h (struct igc_params): New. (init_igc): Take igc_params as argument. * src/emacs.c (parse_igc_params, parse_igc_param): New. (main): Parse igc_params before init_igc. (usage_message, standard_args): Include --igc-param. * src/igc.c (make_arena): Use igc_params to configure pause_time. (init_igc, make_igc): Pass igc_params along. --- src/emacs.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/igc.c | 14 +++++++++----- src/igc.h | 11 ++++++++++- 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/src/emacs.c b/src/emacs.c index 88b96ca7761..ced3f723919 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -291,6 +291,11 @@ #define MAIN_PROGRAM --fingerprint output fingerprint and exit\n\ ", #endif +#if HAVE_MPS + "\ +--igc-param PARAM=VALUE set IGC paramater PARAM to VALUE\n\ +" +#endif #if SECCOMP_USABLE "\ --seccomp=FILE read Seccomp BPF filter from FILE\n\ @@ -730,6 +735,42 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr, } } +#ifdef HAVE_MPS +static void +parse_igc_param (const char *val, struct igc_params *params) +{ + int n = 0; + if ((sscanf (val, "pause_time=%lf%n", ¶ms->pause_time.seconds, &n) == 1) + && val[n] == '\0' && params->pause_time.seconds >= 0) + { + params->pause_time.dflt = false; + return; + } + fprintf (stderr, "Invalid igc_param: %s\n", val); + exit (1); +} + +static struct igc_params +parse_igc_params (int argc, char **argv) +{ + struct igc_params params = { + .pause_time = { .dflt = true }, + .gen_params = { .dflt = true }, + }; + for (int skip = 0; skip != argc;) + { + char *val = NULL; + if (argmatch (argv, argc, "-igc-param", "--igc-param", 11, &val, &skip)) + parse_igc_param (val, ¶ms); + else if (argmatch (argv, argc, "--", NULL, 0, NULL, &skip)) + break; + else + skip++; + } + return params; +} +#endif + #if !defined HAVE_ANDROID || defined ANDROID_STUBIFY /* Find a name (absolute or relative) of the Emacs executable whose @@ -1421,7 +1462,8 @@ main (int argc, char **argv) init_signals (); #ifdef HAVE_MPS - init_igc (); + const struct igc_params params = parse_igc_params (argc, argv); + init_igc (¶ms); #endif /* This is needed early because load_pdump can call 'float-time' (via @@ -2051,6 +2093,15 @@ main (int argc, char **argv) init_module_assertions (module_assertions); #endif +#ifdef HAVE_MPS + { + char *arg; + while (argmatch (argv, argc, "-igc-param", "--igc-param", 11, + &arg, &skip_args)) + ; + } +#endif + #ifdef HAVE_NS if (!noninteractive) { @@ -2681,6 +2732,9 @@ main (int argc, char **argv) { "-no-build-details", "--no-build-details", 63, 0 }, #ifdef HAVE_MODULES { "-module-assertions", "--module-assertions", 62, 0 }, +#endif +#ifdef HAVE_MPS + {"-igc-param", "--igc-param", 61, 1 }, #endif /* -d must come last before the options handled in startup.el. */ { "-d", "--display", 60, 1 }, diff --git a/src/igc.c b/src/igc.c index f069a2becc9..c294eae747e 100644 --- a/src/igc.c +++ b/src/igc.c @@ -4448,12 +4448,16 @@ DEFUN ("igc--set-commit-limit", Figc__set_commit_limit, return Qnil; } +static_assert (sizeof (struct igc_gen_param) == sizeof (mps_gen_param_s)); + static void -make_arena (struct igc *gc) +make_arena (struct igc *gc, const struct igc_params *params) { mps_res_t res; MPS_ARGS_BEGIN (args) { + if (!params->pause_time.dflt) + MPS_ARGS_ADD (args, MPS_KEY_PAUSE_TIME, params->pause_time.seconds); res = mps_arena_create_k (&gc->arena, mps_arena_class_vm (), args); } MPS_ARGS_END (args); @@ -4534,10 +4538,10 @@ make_pool_amcz (struct igc *gc, mps_fmt_t fmt) } static struct igc * -make_igc (void) +make_igc (const struct igc_params *params) { struct igc *gc = xzalloc (sizeof *gc); - make_arena (gc); + make_arena (gc, params); /* We cannot let the GC run until at least all staticpros haven been processed. Otherwise we might allocate objects that are not @@ -4967,11 +4971,11 @@ DEFUN ("igc--remove-extra-dependency", Figc__remove_extra_dependency, ***********************************************************************/ void -init_igc (void) +init_igc (const struct igc_params *params) { /* Returns previous handler. */ (void) mps_lib_assert_fail_install (igc_assert_fail); - global_igc = make_igc (); + global_igc = make_igc (params); add_main_thread (); set_state (IGC_STATE_USABLE_PARKED); } diff --git a/src/igc.h b/src/igc.h index 00e37b6c952..586db8ce77f 100644 --- a/src/igc.h +++ b/src/igc.h @@ -60,8 +60,17 @@ #define EMACS_IGC_H #ifdef HAVE_MPS +struct igc_params +{ + struct + { + bool dflt; + double seconds; /* in seconds; valid values in [0..INF] */ + } pause_time; +}; + void igc_break (void); -void init_igc (void); +void init_igc (const struct igc_params *); void syms_of_igc (void); void *igc_thread_add (struct thread_state *ts); void igc_thread_remove (void **info); -- 2.39.2