From 3d9b103181e510ecb2744c7c4f67bf0c9f0bb94e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 21 Dec 2012 10:05:37 -0700 Subject: [PATCH] clear some pointers after they are free()ed If the pointer value is kept, then its possible (though unlikely) that the GC will get confused. --- src/racket/src/compenv.c | 53 +++++++++++++++------------------------- src/racket/src/future.c | 1 + src/racket/src/place.c | 9 +++++-- 3 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/racket/src/compenv.c b/src/racket/src/compenv.c index 30879b62c0..057d1a649f 100644 --- a/src/racket/src/compenv.c +++ b/src/racket/src/compenv.c @@ -31,8 +31,6 @@ READ_ONLY static Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][MAX_CONST_LOCAL_TYPES][MAX_CONST_LOCAL_FLAG_VAL + 1]; READ_ONLY static Scheme_Object *toplevels[MAX_CONST_TOPLEVEL_DEPTH][MAX_CONST_TOPLEVEL_POS][SCHEME_TOPLEVEL_FLAGS_MASK + 1]; -READ_ONLY static Scheme_Object *unshadowable_symbol; - /* If locked, these are probably sharable: */ THREAD_LOCAL_DECL(static Scheme_Hash_Table *toplevels_ht); THREAD_LOCAL_DECL(static Scheme_Hash_Table *locals_ht[2]); @@ -2421,12 +2419,7 @@ Scheme_Object *scheme_namespace_lookup_value(Scheme_Object *sym, Scheme_Env *gen Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym_marks, Scheme_Comp_Env *env) { Scheme_Comp_Env *frame; - Scheme_Object *esym, *uid = NULL, *env_marks, *prop; - - if (!unshadowable_symbol) { - REGISTER_SO(unshadowable_symbol); - unshadowable_symbol = scheme_intern_symbol("unshadowable"); - } + Scheme_Object *esym, *uid = NULL, *env_marks; /* Walk backward through the frames, looking for a renaming binding with the same marks as the given identifier, sym. Skip over @@ -2438,19 +2431,16 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym for (i = frame->num_bindings; i--; ) { if (frame->values[i]) { if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(frame->values[i]))) { - prop = scheme_stx_property(frame->values[i], unshadowable_symbol, NULL); - if (SCHEME_FALSEP(prop)) { - esym = frame->values[i]; - env_marks = scheme_stx_extract_marks(esym); - if (scheme_equal(env_marks, sym_marks)) { - sym = esym; - if (frame->uids) - uid = frame->uids[i]; - else - uid = frame->uid; - break; - } - } + esym = frame->values[i]; + env_marks = scheme_stx_extract_marks(esym); + if (scheme_equal(env_marks, sym_marks)) { + sym = esym; + if (frame->uids) + uid = frame->uids[i]; + else + uid = frame->uid; + break; + } } } } @@ -2463,18 +2453,15 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(COMPILE_DATA(frame)->const_names[i]))) { esym = COMPILE_DATA(frame)->const_names[i]; - prop = scheme_stx_property(esym, unshadowable_symbol, NULL); - if (SCHEME_FALSEP(prop)) { - env_marks = scheme_stx_extract_marks(esym); - if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */ - sym = esym; - if (COMPILE_DATA(frame)->const_uids) - uid = COMPILE_DATA(frame)->const_uids[i]; - else - uid = frame->uid; - break; - } - } + env_marks = scheme_stx_extract_marks(esym); + if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */ + sym = esym; + if (COMPILE_DATA(frame)->const_uids) + uid = COMPILE_DATA(frame)->const_uids[i]; + else + uid = frame->uid; + break; + } } } } diff --git a/src/racket/src/future.c b/src/racket/src/future.c index f2b9efe8bc..b8a9332b67 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -699,6 +699,7 @@ static void init_future_thread(Scheme_Future_State *fs, int i) t = mz_proc_thread_create_w_stacksize(worker_thread_future_loop, ¶ms, FUTURE_C_STACK_SIZE); mzrt_sema_wait(params.ready_sema); mzrt_sema_destroy(params.ready_sema); + params.ready_sema = NULL; fts->t = t; diff --git a/src/racket/src/place.c b/src/racket/src/place.c index 180289c8d6..d939f298a1 100644 --- a/src/racket/src/place.c +++ b/src/racket/src/place.c @@ -454,16 +454,19 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) { if (!proc_thread) { mzrt_sema_destroy(ready); + ready = NULL; scheme_signal_error("place: place creation failed"); } mz_proc_thread_detach(proc_thread); + proc_thread = NULL; /* wait until the place has started and grabbed the value from `place_data'; it's important that a GC doesn't happen here until the other place is far enough. */ mzrt_sema_wait(ready); mzrt_sema_destroy(ready); + ready = NULL; place_data->ready = NULL; place_data->place_obj = NULL; @@ -2370,6 +2373,7 @@ void scheme_place_check_for_interruption() pause_all_child_places(); mzrt_sema_wait(local_pause); mzrt_sema_destroy(local_pause); + local_pause = NULL; resume_all_child_places(); } else break; @@ -2817,6 +2821,7 @@ static void async_channel_finalize(void *p, void* data) { maybe_report_message_size(ch); mzrt_mutex_destroy(ch->lock); + ch->lock = NULL; for (i = 0; i < ch->size ; i++) { ht = NULL; if (ch->msgs[i]) { @@ -2843,8 +2848,8 @@ static void async_channel_finalize(void *p, void* data) { place_obj = ((Scheme_Place_Object *) ch->wakeup_signal); mzrt_mutex_lock(place_obj->lock); - place_obj->refcount--; - refcount = place_obj->refcount; + place_obj->refcount--; + refcount = place_obj->refcount; mzrt_mutex_unlock(place_obj->lock); if (!refcount) { destroy_place_object_locks(place_obj);