From 851cbf4fccb59c95d3aa9896ad45c0df3eaf9f22 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 16 Nov 2011 18:40:39 -0700 Subject: [PATCH] avoid weak links in the master GC space --- src/racket/src/env.c | 5 ++++- src/racket/src/list.c | 12 ++++++++++++ src/racket/src/module.c | 13 +++++++++++++ src/racket/src/schpriv.h | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/racket/src/env.c b/src/racket/src/env.c index a2292c2d7d..11dd683765 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -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; } diff --git a/src/racket/src/list.c b/src/racket/src/list.c index e404edd450..1c13c7e6a0 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -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; diff --git a/src/racket/src/module.c b/src/racket/src/module.c index 6454824340..a8884b112d 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -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); } diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 266f26277b..2c9272c11b 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -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);