fix non-place-friendly parts of finalizer support

This commit is contained in:
Matthew Flatt 2011-08-04 06:44:34 -06:00
parent cdf2085703
commit 84b9cf6b90
4 changed files with 17 additions and 34 deletions

View File

@ -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_)

View File

@ -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);

View File

@ -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;

View File

@ -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);