fix f(i.e., prevent) flding of inaccessible custodians that have a limit

svn: r6053
This commit is contained in:
Matthew Flatt 2007-04-26 22:36:58 +00:00
parent 853579755d
commit efbc1aadd5
3 changed files with 17 additions and 8 deletions

View File

@ -1985,8 +1985,6 @@ long GC_get_memory_use(void *o)
one that we export out, and it does a metric crapload of work. The second
we use internally, and it doesn't do nearly as much. */
void *watch_for; /* REMOVEME */
/* This is the first mark routine. It's a bit complicated. */
void GC_mark(const void *const_p)
{
@ -1998,10 +1996,6 @@ void GC_mark(const void *const_p)
return;
}
if (watch_for && (p == watch_for)) {
GCPRINT(GCOUTF, "Found it\n");
}
if((page = find_page(p))) {
/* toss this over to the BTC mark routine if we're doing accounting */
if(doing_memory_accounting) { memory_account_mark(page,p); return; }
@ -2409,7 +2403,7 @@ int GC_is_tagged(void *p)
int GC_is_tagged_start(void *p)
{
return 1; /* REMOVEME */
return 0;
}
void *GC_next_tagged_start(void *p)

View File

@ -358,7 +358,7 @@ extern int scheme_overflow_count;
struct Scheme_Custodian {
Scheme_Object so;
short shut_down;
char shut_down, has_limit;
int count, alloc;
Scheme_Object ***boxes;
Scheme_Custodian_Reference **mrefs;

View File

@ -175,6 +175,7 @@ MZ_MARK_POS_TYPE scheme_current_cont_mark_pos;
static Scheme_Custodian *main_custodian;
static Scheme_Custodian *last_custodian;
static Scheme_Hash_Table *limited_custodians = NULL;
/* On swap, put target in a static variable, instead of on the stack,
so that the swapped-out thread is less likely to have a pointer
@ -935,6 +936,15 @@ static Scheme_Object *custodian_limit_mem(int argc, Scheme_Object *args[])
}
}
if (!limited_custodians)
limited_custodians = scheme_make_hash_table(SCHEME_hash_ptr);
scheme_hash_set(limited_custodians, args[0], scheme_true);
((Scheme_Custodian *)args[0])->has_limit = 1;
if (argc > 2) {
scheme_hash_set(limited_custodians, args[2], scheme_true);
((Scheme_Custodian *)args[2])->has_limit = 1;
}
#ifdef MZ_PRECISE_GC
if (GC_set_account_hook(MZACCT_LIMIT, args[0], lim, (argc > 2) ? args[2] : args[0]))
return scheme_void;
@ -1423,6 +1433,10 @@ Scheme_Thread *scheme_do_close_managed(Scheme_Custodian *m, Scheme_Exit_Closer_F
/* Remove this custodian from its parent */
adjust_custodian_family(m, m);
if (m->has_limit) {
scheme_hash_set(limited_custodians, (Scheme_Object *)m, NULL);
}
m = next_m;
}
@ -6075,6 +6089,7 @@ static void make_initial_config(Scheme_Thread *p)
REGISTER_SO(main_custodian);
REGISTER_SO(last_custodian);
REGISTER_SO(limited_custodians);
main_custodian = scheme_make_custodian(NULL);
last_custodian = main_custodian;
init_param(cells, paramz, MZCONFIG_CUSTODIAN, (Scheme_Object *)main_custodian);