diff options
Diffstat (limited to '')
-rw-r--r-- | gc/blacklst.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/gc/blacklst.c b/gc/blacklst.c index 0d623c0..ae2f95c 100644 --- a/gc/blacklst.c +++ b/gc/blacklst.c @@ -12,7 +12,7 @@ * modified is included with the above copyright notice. */ /* Boehm, August 9, 1995 6:09 pm PDT */ -# include "gc_priv.h" +# include "private/gc_priv.h" /* * We maintain several hash tables of hblks that have had false hits. @@ -52,15 +52,19 @@ word GC_black_list_spacing = MINHINCR*HBLKSIZE; /* Initial rough guess */ void GC_clear_bl(); -void GC_default_print_heap_obj_proc(p) -ptr_t p; +# if defined(__STDC__) || defined(__cplusplus) + void GC_default_print_heap_obj_proc(ptr_t p) +# else + void GC_default_print_heap_obj_proc(p) + ptr_t p; +# endif { ptr_t base = GC_base(p); GC_err_printf2("start: 0x%lx, appr. length: %ld", base, GC_size(base)); } -void (*GC_print_heap_obj)(/* char * s, ptr_t p */) = +void (*GC_print_heap_obj) GC_PROTO((ptr_t p)) = GC_default_print_heap_obj_proc; void GC_print_source_ptr(p) @@ -81,18 +85,18 @@ ptr_t p; void GC_bl_init() { -# ifndef ALL_INTERIOR_POINTERS - GC_old_normal_bl = (word *) + if (!GC_all_interior_pointers) { + GC_old_normal_bl = (word *) GC_scratch_alloc((word)(sizeof (page_hash_table))); - GC_incomplete_normal_bl = (word *)GC_scratch_alloc + GC_incomplete_normal_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); - if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) { + if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) { GC_err_printf0("Insufficient memory for black list\n"); EXIT(); + } + GC_clear_bl(GC_old_normal_bl); + GC_clear_bl(GC_incomplete_normal_bl); } - GC_clear_bl(GC_old_normal_bl); - GC_clear_bl(GC_incomplete_normal_bl); -# endif GC_old_stack_bl = (word *)GC_scratch_alloc((word)(sizeof(page_hash_table))); GC_incomplete_stack_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); @@ -127,9 +131,9 @@ void GC_promote_black_lists() GC_old_normal_bl = GC_incomplete_normal_bl; GC_old_stack_bl = GC_incomplete_stack_bl; -# ifndef ALL_INTERIOR_POINTERS + if (!GC_all_interior_pointers) { GC_clear_bl(very_old_normal_bl); -# endif + } GC_clear_bl(very_old_stack_bl); GC_incomplete_normal_bl = very_old_normal_bl; GC_incomplete_stack_bl = very_old_stack_bl; @@ -145,17 +149,23 @@ void GC_promote_black_lists() if (GC_black_list_spacing < 3 * HBLKSIZE) { GC_black_list_spacing = 3 * HBLKSIZE; } + if (GC_black_list_spacing > MAXHINCR * HBLKSIZE) { + GC_black_list_spacing = MAXHINCR * HBLKSIZE; + /* Makes it easier to allocate really huge blocks, which otherwise */ + /* may have problems with nonuniform blacklist distributions. */ + /* This way we should always succeed immediately after growing the */ + /* heap. */ + } } void GC_unpromote_black_lists() { -# ifndef ALL_INTERIOR_POINTERS + if (!GC_all_interior_pointers) { GC_copy_bl(GC_old_normal_bl, GC_incomplete_normal_bl); -# endif + } GC_copy_bl(GC_old_stack_bl, GC_incomplete_stack_bl); } -# ifndef ALL_INTERIOR_POINTERS /* P is not a valid pointer reference, but it falls inside */ /* the plausible heap bounds. */ /* Add it to the normal incomplete black list if appropriate. */ @@ -186,7 +196,6 @@ word p; /* object, and isn't worth black listing. */ } } -# endif /* And the same for false pointers from the stack. */ #ifdef PRINT_BLACK_LIST @@ -229,12 +238,12 @@ word len; register word i; word nblocks = divHBLKSZ(len); -# ifndef ALL_INTERIOR_POINTERS + if (!GC_all_interior_pointers) { if (get_pht_entry_from_index(GC_old_normal_bl, index) || get_pht_entry_from_index(GC_incomplete_normal_bl, index)) { return(h+1); } -# endif + } for (i = 0; ; ) { if (GC_old_stack_bl[divWORDSZ(index)] == 0 |