From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Helmut Eller Newsgroups: gmane.emacs.devel Subject: MPS command line parameters Date: Fri, 16 Aug 2024 09:32:14 +0200 Message-ID: <87zfpcexdt.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="6382"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: emacs-devel@gnu.org, Gerd =?utf-8?Q?M=C3=B6llmann?= To: Pip Cet Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Aug 16 09:32:59 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1serSE-0001Wn-Tt for ged-emacs-devel@m.gmane-mx.org; Fri, 16 Aug 2024 09:32:59 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1serRf-0008ST-JR; Fri, 16 Aug 2024 03:32:23 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1serRd-0008L6-Bg for emacs-devel@gnu.org; Fri, 16 Aug 2024 03:32:21 -0400 Original-Received: from mail-wr1-x432.google.com ([2a00:1450:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1serRa-0005JI-Sc for emacs-devel@gnu.org; Fri, 16 Aug 2024 03:32:21 -0400 Original-Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-37196786139so212787f8f.2 for ; Fri, 16 Aug 2024 00:32:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723793537; x=1724398337; darn=gnu.org; h=mime-version:user-agent:message-id:date:cc:subject:to:from:from:to :cc:subject:date:message-id:reply-to; bh=YhhuJ0GmGqUQbpx0Zr5oIiEsLiQ8CG5YYH9yFyW1G6M=; b=ia+pnp+3tZ9P80wCuEiXP6jPGRleoC3QHyJ2TSb6ma3mOW5M7JtBtUpTMH7KuCNCAy D//JFvhNJxCcndbTaF8KYe9EbmYXllO5PMnlhE1QElV6mQxOQpba7cPQVBWE64uz7uBc elO/4AE5q3MVWzMNEn+p65wUWBCFlMxit56Qn12THwLlSMn/VF7GJIl3z9TU1J+2vd8+ VqnS/MvwyLi1uDpoLUpWCsDzENL+/rLRbUuAHYVGrLFWRj4skpgkuisR/zhvH1X0MBKg NGSyxolDZCJk0nngdoxjzK8+jF2QXBaehhXwoeuiil6bS3p6af/hfx8WwultFFReEM5B Y3Dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723793537; x=1724398337; h=mime-version:user-agent:message-id:date:cc:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YhhuJ0GmGqUQbpx0Zr5oIiEsLiQ8CG5YYH9yFyW1G6M=; b=cM5knzxErd2I6trj23Rkm67TJ1RSbhijm3zMPbrm9mEtB0L6h4b7cPZBpwcI0nB+yb f1UEq+WRmSSjsPGTt697AaWioBcokrgljdpgwME7Icv/mmnt++AzdsF41Z6ng+GCYXAu EBrbzWhju5oMdGddi7EQnlXVt1YgaH6Lv1uQwDO95jaxpvcjV/WWMJVyUAX5KXWscxY7 raUdmbelMl4X4t61kro4ZgPM9CVHxyiEYUK+hn0hHKxgIpyw4rp8UaQqutKbrKvcHbS7 JUVag/8KKyds4+yfaCTX91Lz8Vxyw2B87DgCybUASyn75Bg26/hfs0ydQJsWTy7kPN4s u4Wg== X-Gm-Message-State: AOJu0YzET79SVY9ap4dDC+E8ufZe0VZ3e+pX6UN1bPxp1Hw5fFQPmlfs 16TlVu7TdwdM0J40KRa1KgT31f/M51F4fd1/ymaHsoRcsNBjiiMJ/4Eg8g== X-Google-Smtp-Source: AGHT+IGxfAK6fYI40Rz8iURl6gUAOOlmj+vh2ienbKBJyaoS0ElAy3GJqD2976Nz9KrF8WyQB4ze7Q== X-Received: by 2002:adf:e883:0:b0:367:33f0:91c6 with SMTP id ffacd0b85a97d-371946bf638mr1374390f8f.62.1723793536335; Fri, 16 Aug 2024 00:32:16 -0700 (PDT) Original-Received: from caladan (dial-181089.pool.broadband44.net. [212.46.181.89]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-37189896d74sm3010924f8f.68.2024.08.16.00.32.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Aug 2024 00:32:15 -0700 (PDT) Received-SPF: pass client-ip=2a00:1450:4864:20::432; envelope-from=eller.helmut@gmail.com; helo=mail-wr1-x432.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:322798 Archived-At: --=-=-= Content-Type: text/plain The patches below add a command line option to configure MPS. It can be used like emacs --igc-param pause_time=INF \ --igc-param gen_params=64000k80%,256000k20% \ --igc-param commit_limit=1000000000 WDYT? --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Introduce-a-struct-igc_params.patch >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 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-Add-gen_params-to-igc_params.patch >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 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0003-Add-commit_limit-to-igc_params.patch >From 185135e876ea29511e72db090e91636dc0402344 Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 16 Aug 2024 09:05:06 +0200 Subject: [PATCH 3/4] Add commit_limit to igc_params * src/igc.h (struct igc_params): Add commit_limit field. * src/igc.c (make_arena): Use igc_params to configure commit_limit. * src/emacs.c (parse_igc_params, parse_igc_param): Parse commit_limit. --- src/emacs.c | 9 +++++++++ src/igc.c | 2 ++ src/igc.h | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/src/emacs.c b/src/emacs.c index b2d12b61967..777ca703079 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -790,6 +790,14 @@ parse_igc_param (const char *val, struct igc_params *params) if (strncmp (val, key, strlen (key)) == 0) return parse_igc_gen_params (val + strlen (key), params); + if ((sscanf (val, "commit_limit=%zu%n", ¶ms->commit_limit.bytes, &n) + == 1) + && val[n] == '\0') + { + params->commit_limit.dflt = false; + return; + } + fprintf (stderr, "Invalid igc_param: %s\n", val); exit (1); } @@ -800,6 +808,7 @@ parse_igc_params (int argc, char **argv) struct igc_params params = { .pause_time = { .dflt = true }, .gen_params = { .dflt = true }, + .commit_limit = { .dflt = true }, }; for (int skip = 0; skip != argc;) { diff --git a/src/igc.c b/src/igc.c index 77f897bfdca..89e767ad79f 100644 --- a/src/igc.c +++ b/src/igc.c @@ -4458,6 +4458,8 @@ make_arena (struct igc *gc, const struct igc_params *params) { if (!params->pause_time.dflt) MPS_ARGS_ADD (args, MPS_KEY_PAUSE_TIME, params->pause_time.seconds); + if (!params->commit_limit.dflt) + MPS_ARGS_ADD (args, MPS_KEY_COMMIT_LIMIT, params->commit_limit.bytes); res = mps_arena_create_k (&gc->arena, mps_arena_class_vm (), args); } MPS_ARGS_END (args); diff --git a/src/igc.h b/src/igc.h index 716069adceb..abe2452f625 100644 --- a/src/igc.h +++ b/src/igc.h @@ -79,6 +79,11 @@ #define EMACS_IGC_H size_t gen_count; struct igc_gen_param *gen_params; } gen_params; + struct + { + bool dflt; + size_t bytes; + } commit_limit; }; void igc_break (void); -- 2.39.2 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0004-Remove-igc-set-commit-limit.patch >From 4a7915668552bc029d43b4c6752274c527be7644 Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 16 Aug 2024 09:15:58 +0200 Subject: [PATCH 4/4] Remove igc--set-commit-limit The commit_limit can now be set with the --igc-param command line option. * src/igc.c (Figc__set_commit_limit, mps_res_to_string): Deleted. * test/src/igc-tests.el (set-commit-limit-test): Deleted. --- src/igc.c | 38 -------------------------------------- test/src/igc-tests.el | 12 ------------ 2 files changed, 50 deletions(-) diff --git a/src/igc.c b/src/igc.c index 89e767ad79f..82c5886a8a5 100644 --- a/src/igc.c +++ b/src/igc.c @@ -4411,43 +4411,6 @@ igc_external_header (struct igc_header *h) return header_exthdr (h); } -static const char * -mps_res_to_string (mps_res_t res) -{ - switch (res) - { -#define RES_CASE(prefix, id, doc) \ - case prefix##id: \ - return #prefix #id " " doc; - _mps_RES_ENUM (RES_CASE, MPS_RES_); -#undef RES_CASE - default: - return NULL; - } -} - -DEFUN ("igc--set-commit-limit", Figc__set_commit_limit, - Sigc__set_commit_limit, 1, 1, 0, - doc: /* Set the arena commit limit to LIMIT. -LIMIT can be an integer (number of bytes) or nil (no limit). - -Do NOT use this for anything but testing, unless you -really know what you are doing! */) - (Lisp_Object limit) -{ - size_t nbytes - = NILP (limit) ? ~0 : check_uinteger_max (limit, SIZE_MAX - 1); - mps_res_t err = mps_arena_commit_limit_set (global_igc->arena, nbytes); - if (err != MPS_RES_OK) - { - const char *msg = mps_res_to_string (err); - xsignal3 (Qerror, - intern_c_string (Sigc__set_commit_limit.s.symbol_name), - make_fixnum (err), msg ? build_string (msg) : Qnil); - } - return Qnil; -} - static_assert (sizeof (struct igc_gen_param) == sizeof (mps_gen_param_s)); static void @@ -4995,7 +4958,6 @@ syms_of_igc (void) defsubr (&Sigc_info); defsubr (&Sigc__roots); defsubr (&Sigc__collect); - defsubr (&Sigc__set_commit_limit); defsubr (&Sigc__add_extra_dependency); defsubr (&Sigc__remove_extra_dependency); DEFSYM (Qambig, "ambig"); diff --git a/test/src/igc-tests.el b/test/src/igc-tests.el index 59a0cb83909..2d0e296f06c 100644 --- a/test/src/igc-tests.el +++ b/test/src/igc-tests.el @@ -1,15 +1,3 @@ ;;; igc-tests.el --- tests for src/igc.c -*- lexical-binding: t -*- (require 'ert) - -(ert-deftest set-commit-limit-test () - (should (equal (igc--set-commit-limit (ash 1 30)) nil)) - (should (equal (assoc-string "commit-limit" (igc-info)) - '("commit-limit" 1 1073741824 0))) - (should-error (igc--set-commit-limit -1) - :type 'args-out-of-range) - (should-error (igc--set-commit-limit (- (ash 1 64) 1)) - :type 'args-out-of-range) - (should (equal (igc--set-commit-limit nil) nil)) - (should (equal (assoc-string "commit-limit" (igc-info)) - '("commit-limit" 1 -1 0)))) -- 2.39.2 --=-=-=--