mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-17 01:00:20 +02:00
(scm_gc_register_collectable_memory): avoid
wrap-around for scm_mtrigger (scm_gc_register_collectable_memory): abort on overflowing scm_mallocated().
This commit is contained in:
parent
59e4263131
commit
131805f0cd
2 changed files with 18 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2003-05-14 Han-Wen Nienhuys <hanwen@cs.uu.nl>
|
||||||
|
|
||||||
|
* gc-malloc.c (scm_gc_register_collectable_memory): avoid
|
||||||
|
wrap-around for scm_mtrigger
|
||||||
|
(scm_gc_register_collectable_memory): abort on overflowing
|
||||||
|
scm_mallocated().
|
||||||
|
|
||||||
2003-05-13 Kevin Ryde <user42@zip.com.au>
|
2003-05-13 Kevin Ryde <user42@zip.com.au>
|
||||||
|
|
||||||
* numbers.c (xmpz_cmp_d): New macro, handling infs if gmp doesn't.
|
* numbers.c (xmpz_cmp_d): New macro, handling infs if gmp doesn't.
|
||||||
|
|
|
@ -180,6 +180,11 @@ scm_strdup (const char *str)
|
||||||
void
|
void
|
||||||
scm_gc_register_collectable_memory (void *mem, size_t size, const char *what)
|
scm_gc_register_collectable_memory (void *mem, size_t size, const char *what)
|
||||||
{
|
{
|
||||||
|
if (ULONG_MAX - size < scm_mallocated)
|
||||||
|
{
|
||||||
|
scm_memory_error ("Overflow of scm_mallocated: too much memory in use.");
|
||||||
|
}
|
||||||
|
|
||||||
scm_mallocated += size;
|
scm_mallocated += size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -230,7 +235,12 @@ scm_gc_register_collectable_memory (void *mem, size_t size, const char *what)
|
||||||
float no_overflow_trigger = scm_mallocated * 110.0;
|
float no_overflow_trigger = scm_mallocated * 110.0;
|
||||||
|
|
||||||
no_overflow_trigger /= (float) (100.0 - scm_i_minyield_malloc);
|
no_overflow_trigger /= (float) (100.0 - scm_i_minyield_malloc);
|
||||||
scm_mtrigger = (unsigned long) no_overflow_trigger;
|
|
||||||
|
|
||||||
|
if (no_overflow_trigger >= (float) ULONG_MAX)
|
||||||
|
scm_mtrigger = ULONG_MAX;
|
||||||
|
else
|
||||||
|
scm_mtrigger = (unsigned long) no_overflow_trigger;
|
||||||
|
|
||||||
#ifdef DEBUGINFO
|
#ifdef DEBUGINFO
|
||||||
fprintf (stderr, "Mtrigger sweep: ineffective. New trigger %d\n",
|
fprintf (stderr, "Mtrigger sweep: ineffective. New trigger %d\n",
|
||||||
|
@ -268,7 +278,6 @@ scm_gc_malloc (size_t size, const char *what)
|
||||||
again in scm_gc_register_collectable_memory. We don't really
|
again in scm_gc_register_collectable_memory. We don't really
|
||||||
want the second GC since it will not find new garbage.
|
want the second GC since it will not find new garbage.
|
||||||
|
|
||||||
|
|
||||||
Note: this is a theoretical peeve. In reality, malloc() never
|
Note: this is a theoretical peeve. In reality, malloc() never
|
||||||
returns NULL. Usually, memory is overcommitted, and when you try
|
returns NULL. Usually, memory is overcommitted, and when you try
|
||||||
to write it the program is killed with signal 11. --hwn
|
to write it the program is killed with signal 11. --hwn
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue