fix non-place-friendly parts of finalizer support
This commit is contained in:
parent
cdf2085703
commit
84b9cf6b90
|
@ -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_)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user