mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
Handle GMP allocations through libgc and remove bignum finalizers.
This significantly speeds up loads that create lots of bignums, like (language cps slot-allocation) for files with many top-level definitions. Compiling such a file is typically 2.5 times faster. See <https://lists.gnu.org/archive/html/guile-devel/2020-02/msg00023.html>. * libguile/numbers.c (custom_gmp_malloc): Use 'scm_gc_malloc_pointerless' instead of 'scm_malloc'. (custom_gmp_realloc): Use 'scm_gc_realloc'. (custom_gmp_free): Remove call to 'free'. (make_bignum): Use 'scm_gc_malloc' instead of 'scm_gc_malloc_pointerless'. Call 'scm_i_set_finalizer' only when SCM_INSTALL_GMP_MEMORY_FUNCTIONS is false.
This commit is contained in:
parent
7e7d8b778c
commit
00fbdfa734
1 changed files with 12 additions and 7 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright 1995-2016,2018-2019
|
||||
/* Copyright 1995-2016,2018-2020
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Portions Copyright 1990-1993 by AT&T Bell Laboratories and Bellcore.
|
||||
|
@ -237,19 +237,20 @@ finalize_bignum (void *ptr, void *data)
|
|||
static void *
|
||||
custom_gmp_malloc (size_t alloc_size)
|
||||
{
|
||||
return scm_malloc (alloc_size);
|
||||
return scm_gc_malloc_pointerless (alloc_size, "GMP");
|
||||
}
|
||||
|
||||
static void *
|
||||
custom_gmp_realloc (void *old_ptr, size_t old_size, size_t new_size)
|
||||
{
|
||||
return scm_realloc (old_ptr, new_size);
|
||||
return scm_gc_realloc (old_ptr, old_size, new_size, "GMP");
|
||||
}
|
||||
|
||||
static void
|
||||
custom_gmp_free (void *ptr, size_t size)
|
||||
{
|
||||
free (ptr);
|
||||
/* Do nothing: all memory allocated by GMP is under GC control and
|
||||
will be freed when needed. */
|
||||
}
|
||||
|
||||
|
||||
|
@ -260,10 +261,14 @@ make_bignum (void)
|
|||
scm_t_bits *p;
|
||||
|
||||
/* Allocate one word for the type tag and enough room for an `mpz_t'. */
|
||||
p = scm_gc_malloc_pointerless (sizeof (scm_t_bits) + sizeof (mpz_t),
|
||||
p = scm_gc_malloc (sizeof (scm_t_bits) + sizeof (mpz_t),
|
||||
"bignum");
|
||||
p[0] = scm_tc16_big;
|
||||
|
||||
/* When the 'custom_gmp_*' functions are in use, no need to set a
|
||||
finalizer since allocated memory is under GC control. In other
|
||||
cases, set a finalizer to call 'mpz_clear', which is expensive. */
|
||||
if (!scm_install_gmp_memory_functions)
|
||||
scm_i_set_finalizer (p, finalize_bignum, NULL);
|
||||
|
||||
return SCM_PACK (p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue