diff --git a/src/racket/include/schthread.h b/src/racket/include/schthread.h index e1f1a23ace..7b0810f89e 100644 --- a/src/racket/include/schthread.h +++ b/src/racket/include/schthread.h @@ -207,8 +207,6 @@ typedef struct Thread_Local_Variables { rxpos *maybep_buffer_cache_; rxpos *match_stack_buffer_cache_; uintptr_t scheme_os_thread_stack_base_; - int traversers_registered_; - struct Finalizations **save_fns_ptr_; struct Scheme_Object *scheme_system_idle_channel_; struct Scheme_Object *system_idle_put_evt_; void *stack_copy_cache_[STACK_COPY_CACHE_SIZE]; @@ -540,8 +538,6 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define maybep_buffer_cache XOA (scheme_get_thread_local_variables()->maybep_buffer_cache_) #define match_stack_buffer_cache XOA (scheme_get_thread_local_variables()->match_stack_buffer_cache_) #define scheme_os_thread_stack_base XOA (scheme_get_thread_local_variables()->scheme_os_thread_stack_base_) -#define traversers_registered XOA (scheme_get_thread_local_variables()->traversers_registered_) -#define save_fns_ptr XOA (scheme_get_thread_local_variables()->save_fns_ptr_) #define scheme_system_idle_channel XOA (scheme_get_thread_local_variables()->scheme_system_idle_channel_) #define system_idle_put_evt XOA (scheme_get_thread_local_variables()->system_idle_put_evt_) #define stack_copy_cache XOA (scheme_get_thread_local_variables()->stack_copy_cache_) diff --git a/src/racket/src/env.c b/src/racket/src/env.c index b94c46564e..c6c136b0d3 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -218,8 +218,9 @@ Scheme_Env *scheme_basic_env() return env; } -/* READ-ONLY GLOBAL structures ONE-TIME initialization */ -Scheme_Env *scheme_engine_instance_init() { +Scheme_Env *scheme_engine_instance_init() +/* READ-ONLY GLOBAL structures, ONE-TIME initialization */ +{ Scheme_Env *env; void *stack_base; stack_base = (void *) scheme_get_current_os_thread_stack_base(); @@ -232,6 +233,8 @@ Scheme_Env *scheme_engine_instance_init() { scheme_starting_up = 1; + scheme_init_finalization(); + scheme_init_portable_case(); scheme_init_compenv(); scheme_init_optimize(); @@ -260,7 +263,7 @@ Scheme_Env *scheme_engine_instance_init() { scheme_init_ephemerons(); #endif -/* These calls must be made here so that they allocate out of the master GC */ + /* These calls must be made here so that they allocate out of the master GC */ scheme_init_symbol_table(); scheme_init_module_path_table(); scheme_init_type(); @@ -279,7 +282,6 @@ Scheme_Env *scheme_engine_instance_init() { scheme_spawn_master_place(); #endif - env = place_instance_init(stack_base, 1); diff --git a/src/racket/src/salloc.c b/src/racket/src/salloc.c index 1553fbfb92..949a9eda0a 100644 --- a/src/racket/src/salloc.c +++ b/src/racket/src/salloc.c @@ -1428,10 +1428,14 @@ static void do_next_finalization(void *o, void *_data) } } -/* Makes gc2 xformer happy: */ typedef void (*finalizer_function)(void *p, void *data); -THREAD_LOCAL_DECL(static int traversers_registered); -THREAD_LOCAL_DECL(static Finalizations **save_fns_ptr); + +void scheme_init_finalization() { +#ifdef MZ_PRECISE_GC + GC_REG_TRAV(scheme_rt_finalization, mark_finalization); + GC_REG_TRAV(scheme_rt_finalizations, mark_finalizations); +#endif +} static void add_finalizer(void *v, void (*f)(void*,void*), void *data, int prim, int ext, @@ -1444,15 +1448,6 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, Finalizations *fns, **fns_ptr, *prealloced; Finalization *fn; - if (!traversers_registered) { -#ifdef MZ_PRECISE_GC - GC_REG_TRAV(scheme_rt_finalization, mark_finalization); - GC_REG_TRAV(scheme_rt_finalizations, mark_finalizations); - traversers_registered = 1; -#endif - REGISTER_SO(save_fns_ptr); - } - #ifndef MZ_PRECISE_GC if (v != GC_base(v)) return; @@ -1461,11 +1456,7 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, /* Allocate everything first so that we're not changing finalizations when finalizations could run: */ - if (save_fns_ptr) { - fns_ptr = save_fns_ptr; - save_fns_ptr = NULL; - } else - fns_ptr = MALLOC_ONE(Finalizations*); + fns_ptr = MALLOC_ONE(Finalizations*); if (!ext && !rmve) { fn = MALLOC_ONE_RT(Finalization); @@ -1490,12 +1481,10 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, if (oldf) { if (oldf != do_next_finalization) { /* This happens if an extenal use of GC_ routines conflicts with us. */ - scheme_warning("warning: non-Racket finalization on object dropped! %lx %lx", - (intptr_t)oldf, (intptr_t)olddata); + scheme_warning("warning: non-Racket finalization on object dropped! %p %p", + oldf, olddata); } else { *fns_ptr = *(Finalizations **)olddata; - save_fns_ptr = (Finalizations **)olddata; - *save_fns_ptr = NULL; if (prim && (*fns_ptr)->scheme_first) { /* Reset level back to 1: */ GC_register_eager_finalizer(v, 1, do_next_finalization, fns_ptr, NULL, NULL); @@ -1503,7 +1492,6 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, } } else if (rmve) { GC_register_finalizer(v, NULL, NULL, NULL, NULL); - save_fns_ptr = fns_ptr; return; } @@ -1524,8 +1512,6 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, if (!f && !fns->prim_first && !fns->scheme_first) { /* Removed all finalization */ GC_register_finalizer(v, NULL, NULL, NULL, NULL); - save_fns_ptr = fns_ptr; - *save_fns_ptr = NULL; } } else { if (prim) { @@ -1560,8 +1546,6 @@ static void add_finalizer(void *v, void (*f)(void*,void*), void *data, /* Removed all finalization? */ if (!fns->ext_f && !fns->prim_first && !fns->scheme_first) { GC_register_finalizer(v, NULL, NULL, NULL, NULL); - save_fns_ptr = fns_ptr; - *save_fns_ptr = NULL; } } else { fn->next = fns->scheme_first; diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index d52fb3b535..a3faf80835 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -179,6 +179,7 @@ void scheme_clear_ephemerons(void); extern int scheme_starting_up; +void scheme_init_finalization(void); void scheme_init_portable_case(void); void scheme_init_stack_check(void); void scheme_init_overflow(void);