Moved lots of blame_the_child flats to NewGC struct

svn: r12291
This commit is contained in:
Kevin Tew 2008-11-05 21:08:43 +00:00
parent 0366385251
commit 5ad3d5466e
4 changed files with 48 additions and 41 deletions

View File

@ -313,8 +313,8 @@ foreign.@LTO@: $(XSRCDIR)/foreign.c
main.@LTO@: $(XSRCDIR)/main.c main.@LTO@: $(XSRCDIR)/main.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/main.c -o main.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/main.c -o main.@LTO@
gc2.@LTO@: $(srcdir)/gc2.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/gc2.h \ gc2.@LTO@: $(srcdir)/gc2.c $(srcdir)/newgc.c $(srcdir)/gc2.h \
$(srcdir)/newgc.h \ $(srcdir)/newgc.h $(srcdir)/blame_the_child.c \
$(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\ $(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\
$(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \ $(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \
$(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \ $(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \
@ -322,7 +322,7 @@ gc2.@LTO@: $(srcdir)/gc2.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc
$(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h $(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h
$(CC) $(CFLAGS) -c $(srcdir)/gc2.c -o gc2.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/gc2.c -o gc2.@LTO@
new_gc.@LTO@: $(srcdir)/newgc.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/gc2.h \ new_gc.@LTO@: $(srcdir)/newgc.c $(srcdir)/gc2.h \
$(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\ $(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\
$(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \ $(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \
$(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \ $(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \
@ -330,7 +330,7 @@ new_gc.@LTO@: $(srcdir)/newgc.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/
$(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h $(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h
$(CC) $(CFLAGS) -c $(srcdir)/newgc.c -o new_gc.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/newgc.c -o new_gc.@LTO@
copy_gc.@LTO@: $(srcdir)/copy.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/gc2.h \ copy_gc.@LTO@: $(srcdir)/copy.c $(srcdir)/gc2.h \
$(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\ $(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\
$(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \ $(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \
$(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \ $(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \
@ -338,7 +338,7 @@ copy_gc.@LTO@: $(srcdir)/copy.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/
$(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h $(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h
$(CC) $(CFLAGS) -c $(srcdir)/copy.c -o copy_gc.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/copy.c -o copy_gc.@LTO@
compact_gc.@LTO@: $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/gc2.h \ compact_gc.@LTO@: $(srcdir)/compact.c $(srcdir)/gc2.h \
$(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\ $(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/vm.c\
$(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \ $(srcdir)/vm_memalign.c $(srcdir)/alloc_cache.c \
$(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \ $(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \

View File

@ -15,12 +15,6 @@ struct ot_entry {
static struct ot_entry **owner_table = NULL; static struct ot_entry **owner_table = NULL;
static unsigned int owner_table_top = 0; static unsigned int owner_table_top = 0;
static int doing_memory_accounting = 0;
static int really_doing_accounting = 0;
static int current_mark_owner = 0;
static int old_btc_mark = 0;
static int new_btc_mark = 1;
static int reset_limits = 0, reset_required = 0;
inline static int create_blank_owner_set(void) inline static int create_blank_owner_set(void)
{ {
@ -145,9 +139,9 @@ inline static unsigned long custodian_usage(void *custodian)
unsigned long retval = 0; unsigned long retval = 0;
int i; int i;
if(!really_doing_accounting) { if(!GC->really_doing_accounting) {
GC->park[0] = custodian; GC->park[0] = custodian;
really_doing_accounting = 1; GC->really_doing_accounting = 1;
garbage_collect(1); garbage_collect(1);
custodian = GC->park[0]; custodian = GC->park[0];
GC->park[0] = NULL; GC->park[0] = NULL;
@ -164,17 +158,17 @@ inline static void memory_account_mark(struct mpage *page, void *ptr)
if(page->big_page) { if(page->big_page) {
struct objhead *info = (struct objhead *)(NUM(page->addr) + PREFIX_SIZE); struct objhead *info = (struct objhead *)(NUM(page->addr) + PREFIX_SIZE);
if(info->btc_mark == old_btc_mark) { if(info->btc_mark == GC->old_btc_mark) {
info->btc_mark = new_btc_mark; info->btc_mark = GC->new_btc_mark;
account_memory(current_mark_owner, gcBYTES_TO_WORDS(page->size)); account_memory(GC->current_mark_owner, gcBYTES_TO_WORDS(page->size));
push_ptr(ptr); push_ptr(ptr);
} }
} else { } else {
struct objhead *info = (struct objhead *)((char*)ptr - WORD_SIZE); struct objhead *info = (struct objhead *)((char*)ptr - WORD_SIZE);
if(info->btc_mark == old_btc_mark) { if(info->btc_mark == GC->old_btc_mark) {
info->btc_mark = new_btc_mark; info->btc_mark = GC->new_btc_mark;
account_memory(current_mark_owner, info->size); account_memory(GC->current_mark_owner, info->size);
push_ptr(ptr); push_ptr(ptr);
} }
} }
@ -212,7 +206,7 @@ int BTC_thread_mark(void *p)
int BTC_custodian_mark(void *p) int BTC_custodian_mark(void *p)
{ {
if(custodian_to_owner_set(p) == current_mark_owner) if(custodian_to_owner_set(p) == GC->current_mark_owner)
return GC->normal_custodian_mark(p); return GC->normal_custodian_mark(p);
else else
return ((struct objhead *)(NUM(p) - WORD_SIZE))->size; return ((struct objhead *)(NUM(p) - WORD_SIZE))->size;
@ -282,11 +276,10 @@ inline static void mark_acc_big_page(struct mpage *page)
} }
} }
int kill_propagation_loop = 0;
static void btc_overmem_abort() static void btc_overmem_abort()
{ {
kill_propagation_loop = 1; GC->kill_propagation_loop = 1;
GCWARN((GCOUTF, "WARNING: Ran out of memory accounting. " GCWARN((GCOUTF, "WARNING: Ran out of memory accounting. "
"Info will be wrong.\n")); "Info will be wrong.\n"));
} }
@ -296,7 +289,7 @@ static void propagate_accounting_marks(void)
struct mpage *page; struct mpage *page;
void *p; void *p;
while(pop_ptr(&p) && !kill_propagation_loop) { while(pop_ptr(&p) && !GC->kill_propagation_loop) {
page = pagemap_find_page(p); page = pagemap_find_page(p);
set_backtrace_source(p, page->page_type); set_backtrace_source(p, page->page_type);
GCDEBUG((DEBUGOUTF, "btc_account: popped off page %p:%p, ptr %p\n", page, page->addr, p)); GCDEBUG((DEBUGOUTF, "btc_account: popped off page %p:%p, ptr %p\n", page, page->addr, p));
@ -305,19 +298,19 @@ static void propagate_accounting_marks(void)
else else
mark_normal_obj(page, p); mark_normal_obj(page, p);
} }
if(kill_propagation_loop) if(GC->kill_propagation_loop)
reset_pointer_stack(); reset_pointer_stack();
} }
static void do_btc_accounting(void) static void do_btc_accounting(void)
{ {
if(really_doing_accounting) { if(GC->really_doing_accounting) {
Scheme_Custodian *cur = owner_table[current_owner(NULL)]->originator; Scheme_Custodian *cur = owner_table[current_owner(NULL)]->originator;
Scheme_Custodian_Reference *box = cur->global_next; Scheme_Custodian_Reference *box = cur->global_next;
int i; int i;
GCDEBUG((DEBUGOUTF, "\nBEGINNING MEMORY ACCOUNTING\n")); GCDEBUG((DEBUGOUTF, "\nBEGINNING MEMORY ACCOUNTING\n"));
doing_memory_accounting = 1; GC->doing_memory_accounting = 1;
GC->in_unsafe_allocation_mode = 1; GC->in_unsafe_allocation_mode = 1;
GC->unsafe_allocation_abort = btc_overmem_abort; GC->unsafe_allocation_abort = btc_overmem_abort;
@ -347,9 +340,9 @@ static void do_btc_accounting(void)
while(cur) { while(cur) {
int owner = custodian_to_owner_set(cur); int owner = custodian_to_owner_set(cur);
current_mark_owner = owner; GC->current_mark_owner = owner;
GCDEBUG((DEBUGOUTF,"MARKING THREADS OF OWNER %i (CUST %p)\n", owner, cur)); GCDEBUG((DEBUGOUTF,"MARKING THREADS OF OWNER %i (CUST %p)\n", owner, cur));
kill_propagation_loop = 0; GC->kill_propagation_loop = 0;
mark_threads(owner); mark_threads(owner);
mark_cust_boxes(cur); mark_cust_boxes(cur);
GCDEBUG((DEBUGOUTF, "Propagating accounting marks\n")); GCDEBUG((DEBUGOUTF, "Propagating accounting marks\n"));
@ -364,9 +357,9 @@ static void do_btc_accounting(void)
GC->mark_table[GC->cust_box_tag] = GC->normal_cust_box_mark; GC->mark_table[GC->cust_box_tag] = GC->normal_cust_box_mark;
GC->in_unsafe_allocation_mode = 0; GC->in_unsafe_allocation_mode = 0;
doing_memory_accounting = 0; GC->doing_memory_accounting = 0;
old_btc_mark = new_btc_mark; GC->old_btc_mark = GC->new_btc_mark;
new_btc_mark = !new_btc_mark; GC->new_btc_mark = !GC->new_btc_mark;
} }
clear_stack_pages(); clear_stack_pages();
@ -385,18 +378,18 @@ inline static void add_account_hook(int type,void *c1,void *c2,unsigned long b)
{ {
struct account_hook *work; struct account_hook *work;
if(!really_doing_accounting) { if(!GC->really_doing_accounting) {
GC->park[0] = c1; GC->park[1] = c2; GC->park[0] = c1; GC->park[1] = c2;
really_doing_accounting = 1; GC->really_doing_accounting = 1;
garbage_collect(1); garbage_collect(1);
c1 = GC->park[0]; c2 = GC->park[1]; c1 = GC->park[0]; c2 = GC->park[1];
GC->park[0] = GC->park[1] = NULL; GC->park[0] = GC->park[1] = NULL;
} }
if (type == MZACCT_LIMIT) if (type == MZACCT_LIMIT)
reset_limits = 1; GC->reset_limits = 1;
if (type == MZACCT_REQUIRE) if (type == MZACCT_REQUIRE)
reset_required = 1; GC->reset_required = 1;
for(work = hooks; work; work = work->next) { for(work = hooks; work; work = work->next) {
if((work->type == type) && (work->c2 == c2) && (work->c1 == c1)) { if((work->type == type) && (work->c2 == c2) && (work->c1 == c1)) {
@ -440,12 +433,12 @@ static unsigned long custodian_super_require(void *c)
{ {
int set = ((Scheme_Custodian *)c)->gc_owner_set; int set = ((Scheme_Custodian *)c)->gc_owner_set;
if (reset_required) { if (GC->reset_required) {
int i; int i;
for(i = 1; i < owner_table_top; i++) for(i = 1; i < owner_table_top; i++)
if (owner_table[i]) if (owner_table[i])
owner_table[i]->required_set = 0; owner_table[i]->required_set = 0;
reset_required = 0; GC->reset_required = 0;
} }
if (!owner_table[set]->required_set) { if (!owner_table[set]->required_set) {
@ -497,12 +490,12 @@ static unsigned long custodian_single_time_limit(int set)
if (!set) if (!set)
return (unsigned long)(long)-1; return (unsigned long)(long)-1;
if (reset_limits) { if (GC->reset_limits) {
int i; int i;
for(i = 1; i < owner_table_top; i++) for(i = 1; i < owner_table_top; i++)
if (owner_table[i]) if (owner_table[i])
owner_table[i]->limit_set = 0; owner_table[i]->limit_set = 0;
reset_limits = 0; GC->reset_limits = 0;
} }
if (!owner_table[set]->limit_set) { if (!owner_table[set]->limit_set) {
@ -538,7 +531,7 @@ static unsigned long custodian_single_time_limit(int set)
# define set_account_hook(a,b,c,d) { add_account_hook(a,b,c,d); return 1; } # define set_account_hook(a,b,c,d) { add_account_hook(a,b,c,d); return 1; }
# define set_btc_mark(x) (((struct objhead *)(x))->btc_mark = old_btc_mark) # define set_btc_mark(x) (((struct objhead *)(x))->btc_mark = GC->old_btc_mark)
#endif #endif
#ifndef NEWGC_BTC_ACCOUNT #ifndef NEWGC_BTC_ACCOUNT

View File

@ -1459,7 +1459,7 @@ void GC_mark(const void *const_p)
} }
/* toss this over to the BTC mark routine if we're doing accounting */ /* toss this over to the BTC mark routine if we're doing accounting */
if(doing_memory_accounting) { memory_account_mark(page,p); return; } if(GC->doing_memory_accounting) { memory_account_mark(page,p); return; }
if(page->big_page) { if(page->big_page) {
/* This is a bigpage. The first thing we do is see if its been marked /* This is a bigpage. The first thing we do is see if its been marked

View File

@ -128,6 +128,19 @@ typedef struct NewGC {
unsigned char gc_full :1; /* a flag saying if this is a full/major collection */ unsigned char gc_full :1; /* a flag saying if this is a full/major collection */
unsigned char running_finalizers :1; unsigned char running_finalizers :1;
/* blame the child */
unsigned int doing_memory_accounting :1;
unsigned int really_doing_accounting :1;
unsigned int old_btc_mark :1;
unsigned int new_btc_mark :1;
unsigned int reset_limits :1;
unsigned int reset_required :1;
unsigned int kill_propagation_loop :1;
unsigned int current_mark_owner;
//static struct ot_entry **owner_table = NULL;
unsigned int owner_table_top;
unsigned long number_of_gc_runs; unsigned long number_of_gc_runs;
unsigned int since_last_full; unsigned int since_last_full;
unsigned long last_full_mem_use; unsigned long last_full_mem_use;
@ -171,4 +184,5 @@ void NewGC_initialize(NewGC *newgc) {
newgc->generations_available = 1; newgc->generations_available = 1;
newgc->last_full_mem_use = (20 * 1024 * 1024); newgc->last_full_mem_use = (20 * 1024 * 1024);
newgc->new_btc_mark = 1;
} }