Updates from 0.2.1 into 0.2.1-inu-1.5
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user