avoid weak links in the master GC space
This commit is contained in:
parent
b726209dc5
commit
851cbf4fcc
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user