1
Fork 0
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:
Han-Wen Nienhuys 2003-05-14 11:01:23 +00:00
parent 59e4263131
commit 131805f0cd
2 changed files with 18 additions and 2 deletions

View file

@ -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.

View file

@ -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