summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHan-Wen Nienhuys <hanwen@lilypond.org>2002-09-05 21:55:33 +0000
committerHan-Wen Nienhuys <hanwen@lilypond.org>2002-09-05 21:55:33 +0000
commitdac04e9fb9fe0fcd39a375b57f8380e1798c7ef7 (patch)
tree670617a4d40d13a090b543c5b5984dff1b61fbf5
parentffd724008bab4ee230af0a9210b19166b2c04f71 (diff)
downloadguile-dac04e9fb9fe0fcd39a375b57f8380e1798c7ef7.tar.gz
* gc-segment.c (scm_i_make_initial_segment): check user settings
for sanity. * gc-malloc.c (scm_gc_init_malloc): check user settings for sanity. (scm_gc_register_collectable_memory): prevent overflow of memory counts. * gc-freelist.c (scm_init_freelist): check user settings for sanity. * gc-malloc.c (scm_gc_register_collectable_memory): use floats; these won't ever wrap around with high memory usage. * gc-freelist.c: include <stdio.h> * gc-malloc.c: add DEBUGINFO for mtrigger GCs.
-rw-r--r--libguile/ChangeLog10
-rw-r--r--libguile/gc-freelist.c16
-rw-r--r--libguile/gc-malloc.c13
-rw-r--r--libguile/gc-segment.c9
-rw-r--r--libguile/private-gc.h5
5 files changed, 42 insertions, 11 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index d8eb34c4d..7f722f3a9 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,5 +1,15 @@
2002-09-05 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ * gc-segment.c (scm_i_make_initial_segment): check user settings
+ for sanity.
+
+ * gc-malloc.c (scm_gc_init_malloc): check user settings for
+ sanity.
+ (scm_gc_register_collectable_memory): prevent overflow of memory
+ counts.
+
+ * gc-freelist.c (scm_init_freelist): check user settings for sanity.
+
* struct.h: change scm_structs_to_free to scm_i_structs_to_free
* gc-malloc.c (scm_gc_register_collectable_memory): use floats;
diff --git a/libguile/gc-freelist.c b/libguile/gc-freelist.c
index 8425a6eea..1b9780531 100644
--- a/libguile/gc-freelist.c
+++ b/libguile/gc-freelist.c
@@ -138,6 +138,11 @@ scm_init_freelist (scm_t_cell_type_statistics *freelist,
int span,
int min_yield)
{
+ if (min_yield < 1)
+ min_yield = 1;
+ if (min_yield > 99)
+ min_yield = 99;
+
freelist->heap_segment_idx = -1;
freelist->min_yield = 0;
freelist->min_yield_fraction = min_yield;
@@ -158,10 +163,9 @@ scm_init_freelist (scm_t_cell_type_statistics *freelist,
void
scm_gc_init_freelist (void)
{
- size_t init_heap_size_1
+ int init_heap_size_1
= scm_getenv_int ("GUILE_INIT_SEGMENT_SIZE_1", SCM_DEFAULT_INIT_HEAP_SIZE_1);
-
- size_t init_heap_size_2
+ int init_heap_size_2
= scm_getenv_int ("GUILE_INIT_SEGMENT_SIZE_2", SCM_DEFAULT_INIT_HEAP_SIZE_2);
scm_i_freelist = SCM_EOL;
@@ -172,12 +176,14 @@ scm_gc_init_freelist (void)
scm_init_freelist (&scm_i_master_freelist, 1,
scm_getenv_int ("GUILE_MIN_YIELD_1", SCM_DEFAULT_MIN_YIELD_1));
-
scm_max_segment_size = scm_getenv_int ("GUILE_MAX_SEGMENT_SIZE", SCM_DEFAULT_MAX_SEGMENT_SIZE);
+
+ if (scm_max_segment_size <= 0)
+ scm_max_segment_size = SCM_DEFAULT_MAX_SEGMENT_SIZE;
+
scm_i_make_initial_segment (init_heap_size_1, &scm_i_master_freelist);
scm_i_make_initial_segment (init_heap_size_2, &scm_i_master_freelist2);
-
#if (SCM_ENABLE_DEPRECATED == 1)
if ( scm_default_init_heap_size_1 ||
diff --git a/libguile/gc-malloc.c b/libguile/gc-malloc.c
index 2f39db0da..9703051db 100644
--- a/libguile/gc-malloc.c
+++ b/libguile/gc-malloc.c
@@ -106,6 +106,14 @@ scm_gc_init_malloc (void)
SCM_DEFAULT_INIT_MALLOC_LIMIT);
scm_i_minyield_malloc = scm_getenv_int ("GUILE_MIN_YIELD_MALLOC",
SCM_DEFAULT_MALLOC_MINYIELD);
+
+ if (scm_i_minyield_malloc >= 100)
+ scm_i_minyield_malloc = 99;
+ if (scm_i_minyield_malloc < 1)
+ scm_i_minyield_malloc = 1;
+
+ if (scm_mtrigger < 0)
+ scm_mtrigger = SCM_DEFAULT_INIT_MALLOC_LIMIT;
}
@@ -226,7 +234,10 @@ scm_gc_register_collectable_memory (void *mem, size_t size, const char *what)
Instead of getting bogged down, we let the mtrigger grow
strongly with it.
*/
- scm_mtrigger = (scm_mallocated * 110) / (100 - scm_i_minyield_malloc);
+ float no_overflow_trigger = (float)(scm_mallocated * 110);
+
+ no_overflow_trigger /= (float) (100 - scm_i_minyield_malloc);
+ scm_mtrigger = (unsigned long) no_overflow_trigger;
#ifdef DEBUGINFO
fprintf (stderr, "Mtrigger sweep: ineffective. New trigger %d\n", scm_mtrigger);
diff --git a/libguile/gc-segment.c b/libguile/gc-segment.c
index ec0c2cf80..1596561b0 100644
--- a/libguile/gc-segment.c
+++ b/libguile/gc-segment.c
@@ -520,12 +520,15 @@ scm_i_get_new_heap_segment (scm_t_cell_type_statistics *freelist, policy_on_erro
return -1;
}
-
-
void
-scm_i_make_initial_segment (size_t init_heap_size, scm_t_cell_type_statistics *freelist)
+scm_i_make_initial_segment (int init_heap_size, scm_t_cell_type_statistics *freelist)
{
scm_t_heap_segment * seg = scm_i_make_empty_heap_segment (freelist);
+
+ if (init_heap_size < 1)
+ {
+ init_heap_size = SCM_DEFAULT_INIT_HEAP_SIZE_1;
+ }
if (scm_i_initialize_heap_segment_data (seg, init_heap_size))
{
diff --git a/libguile/private-gc.h b/libguile/private-gc.h
index e9c170f12..484b34919 100644
--- a/libguile/private-gc.h
+++ b/libguile/private-gc.h
@@ -124,7 +124,8 @@ extern unsigned long scm_gc_cells_collected_1;
void scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist);
void scm_i_gc_sweep_freelist_reset (scm_t_cell_type_statistics *freelist);
int scm_i_gc_grow_heap_p (scm_t_cell_type_statistics * freelist);
-
+
+
#define SCM_HEAP_SIZE \
(scm_i_master_freelist.heap_size + scm_i_master_freelist2.heap_size)
@@ -228,7 +229,7 @@ void scm_i_sweep_segments (void);
SCM scm_i_sweep_some_segments (scm_t_cell_type_statistics * fl);
void scm_i_reset_segments (void);
void scm_i_sweep_all_segments (char const *reason);
-void scm_i_make_initial_segment (size_t init_heap_size, scm_t_cell_type_statistics *freelist);
+void scm_i_make_initial_segment (int init_heap_size, scm_t_cell_type_statistics *freelist);
extern long int scm_i_deprecated_memory_return;