avoid weak links in the master GC space

This commit is contained in:
Matthew Flatt 2011-11-16 18:40:39 -07:00
parent b726209dc5
commit 851cbf4fcc
4 changed files with 30 additions and 1 deletions

View File

@ -1132,7 +1132,10 @@ Scheme_Object *scheme_get_home_weak_link(Scheme_Env *e)
{
if (!e->weak_self_link) {
Scheme_Object *wb;
wb = scheme_make_weak_box((Scheme_Object *)e);
if (scheme_starting_up)
wb = scheme_box((Scheme_Object *)e);
else
wb = scheme_make_weak_box((Scheme_Object *)e);
e->weak_self_link = wb;
}

View File

@ -1749,6 +1749,18 @@ Scheme_Bucket_Table *scheme_make_weak_equal_table(void)
return t;
}
Scheme_Bucket_Table *scheme_make_nonlock_equal_bucket_table(void)
{
Scheme_Bucket_Table *t;
t = scheme_make_bucket_table(20, SCHEME_hash_ptr);
t->compare = compare_equal;
t->make_hash_indices = make_hash_indices_for_equal;
return t;
}
Scheme_Bucket_Table *scheme_make_weak_eqv_table(void)
{
Scheme_Object *sema;

View File

@ -3036,7 +3036,11 @@ static Scheme_Object *module_path_index_join(int argc, Scheme_Object *argv[])
void scheme_init_module_path_table()
{
REGISTER_SO(modpath_table);
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
modpath_table = scheme_make_nonlock_equal_bucket_table();
#else
modpath_table = scheme_make_weak_equal_table();
#endif
}
static Scheme_Object *make_resolved_module_path_obj(Scheme_Object *o)
@ -3108,7 +3112,11 @@ Scheme_Object *scheme_intern_resolved_module_path(Scheme_Object *o)
#endif
b = scheme_bucket_or_null_from_table(modpath_table, (const char *)rmp, 0);
if (b) {
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
return (Scheme_Object *)b->key;
#else
return (Scheme_Object *)HT_EXTRACT_WEAK(b->key);
#endif
}
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
@ -3122,6 +3130,11 @@ Scheme_Object *scheme_intern_resolved_module_path(Scheme_Object *o)
scheme_end_atomic_no_swap();
if (!b->val)
b->val = scheme_true;
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
if (!place_local_modpath_table)
return (Scheme_Object *)b->key;
#endif
return(Scheme_Object *)HT_EXTRACT_WEAK(b->key);
}

View File

@ -3603,6 +3603,7 @@ void scheme_bad_vec_index(char *name, Scheme_Object *i,
intptr_t bottom, intptr_t len);
Scheme_Bucket_Table *scheme_make_weak_equal_table(void);
Scheme_Bucket_Table *scheme_make_nonlock_equal_bucket_table(void);
int scheme_hash_table_equal_rec(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2, void *eql);
int scheme_bucket_table_equal_rec(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2, void *eql);