summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2021-04-26 22:26:31 +0200
committerAndy Wingo <wingo@pobox.com>2021-04-26 22:27:22 +0200
commit534dd35a3c3e842d8547e83c38e5b67e99af89b5 (patch)
tree383b25f19aead3ca1dd9b34645fcda3f4e27e24f
parent04e9245918d3cfa985a4cf6b0850370d22eced04 (diff)
downloadguile-534dd35a3c3e842d8547e83c38e5b67e99af89b5.tar.gz
Allow users to force gmp to use libgc
* doc/ref/guile-invoke.texi (Environment Variables): Document GUILE_INSTALL_GMP_MEMORY_FUNCTIONS. * libguile/numbers.c (scm_init_numbers): Use environment variable.
-rw-r--r--doc/ref/guile-invoke.texi13
-rw-r--r--libguile/numbers.c9
2 files changed, 22 insertions, 0 deletions
diff --git a/doc/ref/guile-invoke.texi b/doc/ref/guile-invoke.texi
index ee5f23e50..92208d559 100644
--- a/doc/ref/guile-invoke.texi
+++ b/doc/ref/guile-invoke.texi
@@ -424,6 +424,19 @@ Guile uses the environment variable @env{HOME}, the name of your home
directory, to locate various files, such as @file{.guile} or
@file{.guile_history}.
+@item GUILE_INSTALL_GMP_MEMORY_FUNCTIONS
+@vindex GUILE_INSTALL_GMP_MEMORY_FUNCTIONS
+Guile uses the GNU multi-precision (GMP) library to implement its bigint
+support. It can use an included minimal version of GMP, or the system
+version, which may be more optimal. If Guile is the sole user of GMP in
+the process, Guile can tell GMP to allocate its digits using
+garbage-collected memory. This can be significantly faster. However
+this approach is unsafe if there are other libraries loaded that use
+libgmp, such as the GnuTLS library. The default is for Guile to do the
+fastest safe thing: use the garbage collector for GMP when using the
+included ``mini-GMP'', but not otherwise. Set this variable to nonzero
+to force GMP to use garbage-collected memory, even when using system GC.
+
@item GUILE_JIT_THRESHOLD
@vindex GUILE_JIT_THRESHOLD
Guile has a just-in-time (JIT) code generator that makes running Guile
diff --git a/libguile/numbers.c b/libguile/numbers.c
index 0aa18e59a..a4c8308f4 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -10412,6 +10412,15 @@ SCM_PRIMITIVE_GENERIC (scm_sqrt, "sqrt", 1, 0, 0,
void
scm_init_numbers ()
{
+ /* Give the user the chance to force the use of libgc to manage gmp
+ digits, if we know there are no external GMP users in this process.
+ Can be an important optimization for those who link external GMP,
+ before we switch to the MPN API. */
+ if (!SCM_ENABLE_MINI_GMP)
+ scm_install_gmp_memory_functions
+ = scm_getenv_int ("GUILE_INSTALL_GMP_MEMORY_FUNCTIONS",
+ scm_install_gmp_memory_functions);
+
if (scm_install_gmp_memory_functions)
mp_set_memory_functions (custom_gmp_malloc,
custom_gmp_realloc,