From bea22974216d0b8f26b3b79f6596ee3aaafd6329 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Thu, 20 Nov 2008 23:36:54 +0000 Subject: [PATCH] Make GC callbacks members of NewGC svn: r12549 --- src/mred/wxs/wxscheme.cxx | 6 ++--- src/mzscheme/gc/alloc.c | 16 ++++++++++++-- src/mzscheme/gc/include/gc.h | 6 +++-- src/mzscheme/gc2/gc2.h | 16 +++++++++----- src/mzscheme/gc2/newgc.c | 43 +++++++++++++++++++++++++++--------- src/mzscheme/gc2/newgc.h | 6 +++++ src/mzscheme/sgc/sgc.c | 19 ++++++++++++++-- src/mzscheme/src/port.c | 7 ++---- src/mzscheme/src/salloc.c | 2 +- src/mzscheme/src/thread.c | 16 +++++--------- 10 files changed, 94 insertions(+), 43 deletions(-) diff --git a/src/mred/wxs/wxscheme.cxx b/src/mred/wxs/wxscheme.cxx index 4b5372865a..4168f8f063 100644 --- a/src/mred/wxs/wxscheme.cxx +++ b/src/mred/wxs/wxscheme.cxx @@ -162,10 +162,8 @@ void wxsScheme_setup(Scheme_Env *env) get_ps_setup_from_user = scheme_false; message_box = scheme_false; - orig_collect_start_callback = GC_collect_start_callback; - GC_collect_start_callback = (GC_START_END_PTR)collect_start_callback; - orig_collect_end_callback = GC_collect_end_callback; - GC_collect_end_callback = (GC_START_END_PTR)collect_end_callback; + orig_collect_start_callback = GC_set_collect_start_callback(collect_start_callback); + orig_collect_end_callback = GC_set_collect_end_callback(collect_end_callback); } extern "C" { diff --git a/src/mzscheme/gc/alloc.c b/src/mzscheme/gc/alloc.c index 75db270553..1ef473e1ff 100644 --- a/src/mzscheme/gc/alloc.c +++ b/src/mzscheme/gc/alloc.c @@ -320,8 +320,20 @@ void GC_maybe_gc() } /* PLTSCHEME: notification callback for starting/ending a GC */ -void (*GC_collect_start_callback)(void) = NULL; -void (*GC_collect_end_callback)(void) = NULL; +GC_collect_start_callback_Proc GC_collect_start_callback = NULL; +GC_collect_end_callback_Proc GC_collect_end_callback = NULL; +GC_collect_start_callback_Proc GC_set_collect_start_callback(GC_collect_start_callback_Proc func) { + GC_collect_start_callback_Proc old; + old = GC_collect_start_callback; + GC_collect_start_callback = func; + return old; +} +GC_collect_end_callback_Proc GC_set_collect_end_callback(GC_collect_end_callback_Proc func) { + GC_collect_end_callback_Proc old; + old = GC_collect_end_callback; + GC_collect_end_callback = func; + return old; +} /* * Stop the world garbage collection. Assumes lock held, signals disabled. diff --git a/src/mzscheme/gc/include/gc.h b/src/mzscheme/gc/include/gc.h index dc61c1434a..3c482034a3 100644 --- a/src/mzscheme/gc/include/gc.h +++ b/src/mzscheme/gc/include/gc.h @@ -1017,13 +1017,15 @@ extern void GC_thr_init GC_PROTO((void));/* Needed for Solaris/X86 */ #if defined(GC_REDIRECT_TO_LOCAL) && !defined(GC_LOCAL_ALLOC_H) # include "gc_local_alloc.h" #endif +typedef void (*GC_collect_start_callback_Proc)(void); +typedef void (*GC_collect_end_callback_Proc)(void); /* PLTSCHEME: */ GC_API void (*GC_custom_finalize)(void); GC_API void (*GC_push_last_roots)(void); GC_API void (*GC_push_last_roots_again)(void); -GC_API void (*GC_collect_start_callback)(void); -GC_API void (*GC_collect_end_callback)(void); +GC_API GC_collect_start_callback_Proc GC_set_collect_start_callback(GC_collect_start_callback_Proc); +GC_API GC_collect_end_callback_Proc GC_set_collect_end_callback(GC_collect_end_callback_Proc); GC_API void (*GC_out_of_memory)(void); GC_API int GC_did_mark_stack_overflow(void); GC_API void GC_mark_from_mark_stack(void); diff --git a/src/mzscheme/gc2/gc2.h b/src/mzscheme/gc2/gc2.h index 807e869778..01d6503c46 100644 --- a/src/mzscheme/gc2/gc2.h +++ b/src/mzscheme/gc2/gc2.h @@ -21,6 +21,10 @@ typedef int (*Size_Proc)(void *obj); typedef int (*Mark_Proc)(void *obj); typedef int (*Fixup_Proc)(void *obj); +typedef void (*GC_collect_start_callback_Proc)(void); +typedef void (*GC_collect_end_callback_Proc)(void); +typedef void (*GC_collect_inform_callback_Proc)(int major_gc, long pre_used, long post_used); +typedef unsigned long (*GC_get_thread_stack_base_Proc)(void); /* Types of the traversal procs (supplied by MzScheme); see overview in README for information about traversals. The return value is the size of @@ -56,9 +60,9 @@ extern "C" { /* Administration */ /***************************************************************************/ -GC2_EXTERN unsigned long (*GC_get_thread_stack_base)(void); +GC2_EXTERN void GC_set_get_thread_stack_base(unsigned long (*)(void)); /* - Called by GC to get the base for stack traversal in the current + Sets callback called by GC to get the base for stack traversal in the current thread (see README). The returned address must not be in the middle of a variable-stack record. */ @@ -96,11 +100,11 @@ GC2_EXTERN void GC_register_thread(void *, void *); /* Indicates that a a thread record is owned by a particular custodian. */ -GC2_EXTERN void (*GC_collect_start_callback)(void); -GC2_EXTERN void (*GC_collect_end_callback)(void); -GC2_EXTERN void (*GC_collect_inform_callback)(int major_gc, long pre_used, long post_used); +GC2_EXTERN GC_collect_start_callback_Proc GC_set_collect_start_callback(GC_collect_start_callback_Proc); +GC2_EXTERN GC_collect_end_callback_Proc GC_set_collect_end_callback(GC_collect_end_callback_Proc); +GC2_EXTERN void GC_set_collect_inform_callback(GC_collect_inform_callback_Proc); /* - Called by GC before/after performing a collection. Used by MzScheme + Sets callbacks called by GC before/after performing a collection. Used by MzScheme to zero out some data and record collection times. The end procedure should be called before finalizations are performed. */ diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 3d26e0214c..4b0ad4cb1d 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -130,15 +130,31 @@ static THREAD_LOCAL NewGC *GC; #define GENERATIONS 1 /* the externals */ -void (*GC_collect_start_callback)(void); -void (*GC_collect_end_callback)(void); -void (*GC_collect_inform_callback)(int major_gc, long pre_used, long post_used); void (*GC_out_of_memory)(void); void (*GC_report_out_of_memory)(void); -unsigned long (*GC_get_thread_stack_base)(void); void (*GC_mark_xtagged)(void *obj); void (*GC_fixup_xtagged)(void *obj); +GC_collect_start_callback_Proc GC_set_collect_start_callback(GC_collect_start_callback_Proc func) { + NewGC *gc = GC_get_GC(); + GC_collect_start_callback_Proc old; + old = gc->GC_collect_start_callback; + gc->GC_collect_start_callback = func; + return old; +} +GC_collect_end_callback_Proc GC_set_collect_end_callback(GC_collect_end_callback_Proc func) { + NewGC *gc = GC_get_GC(); + GC_collect_end_callback_Proc old; + old = gc->GC_collect_end_callback; + gc->GC_collect_end_callback = func; + return old; +} +void GC_set_collect_inform_callback(void (*func)(int major_gc, long pre_used, long post_used)) { + NewGC *gc = GC_get_GC(); + gc->GC_collect_inform_callback = func; +} + + #include "my_qsort.c" /*****************************************************************************/ @@ -982,8 +998,13 @@ unsigned long GC_get_stack_base() return gc->stack_base; } +void GC_set_get_thread_stack_base(unsigned long (*func)(void)) { + NewGC *gc = GC_get_GC(); + gc->GC_get_thread_stack_base = func; +} + static inline void *get_stack_base(NewGC *gc) { - if (GC_get_thread_stack_base) return (void*) GC_get_thread_stack_base(); + if (gc->GC_get_thread_stack_base) return (void*) gc->GC_get_thread_stack_base(); return (void*) gc->stack_base; } @@ -2409,8 +2430,8 @@ static void garbage_collect(NewGC *gc, int force_full) TIME_INIT(); /* inform the system (if it wants us to) that we're starting collection */ - if(GC_collect_start_callback) - GC_collect_start_callback(); + if(gc->GC_collect_start_callback) + gc->GC_collect_start_callback(); TIME_STEP("started"); @@ -2530,10 +2551,10 @@ static void garbage_collect(NewGC *gc, int force_full) gc->last_full_mem_use = gc->memory_in_use; /* inform the system (if it wants us to) that we're done with collection */ - if (GC_collect_start_callback) - GC_collect_end_callback(); - if (GC_collect_inform_callback) - GC_collect_inform_callback(gc->gc_full, old_mem_use + old_gen0, gc->memory_in_use); + if (gc->GC_collect_start_callback) + gc->GC_collect_end_callback(); + if (gc->GC_collect_inform_callback) + gc->GC_collect_inform_callback(gc->gc_full, old_mem_use + old_gen0, gc->memory_in_use); TIME_STEP("ended"); diff --git a/src/mzscheme/gc2/newgc.h b/src/mzscheme/gc2/newgc.h index c5f05eeacc..2b6e087f5c 100644 --- a/src/mzscheme/gc2/newgc.h +++ b/src/mzscheme/gc2/newgc.h @@ -151,6 +151,12 @@ typedef struct NewGC { unsigned long num_minor_collects; unsigned long num_major_collects; + /* Callbacks */ + void (*GC_collect_start_callback)(void); + void (*GC_collect_end_callback)(void); + void (*GC_collect_inform_callback)(int major_gc, long pre_used, long post_used); + unsigned long (*GC_get_thread_stack_base)(void); + GC_Immobile_Box *immobile_boxes; /* Common with CompactGC */ diff --git a/src/mzscheme/sgc/sgc.c b/src/mzscheme/sgc/sgc.c index fbc280d7db..31330e255c 100644 --- a/src/mzscheme/sgc/sgc.c +++ b/src/mzscheme/sgc/sgc.c @@ -776,10 +776,25 @@ static long mem_traced; static long num_chunks; static long num_blocks; -void (*GC_collect_start_callback)(void); -void (*GC_collect_end_callback)(void); +typedef void (*GC_collect_start_callback_Proc)(void); +typedef void (*GC_collect_end_callback_Proc)(void); +GC_collect_start_callback_Proc GC_collect_start_callback; +GC_collect_end_callback_Proc GC_collect_end_callback; void (*GC_custom_finalize)(void); +GC_collect_start_callback_Proc GC_set_collect_start_callback(GC_collect_start_callback_Proc) { + GC_collect_start_callback_Proc old; + old = GC_collect_start_callback; + GC_collect_start_callback = func; + return old +} +GC_collect_end_callback_Proc GC_set_collect_end_callback(GC_collect_end_callback_Proc) { + GC_collect_end_callback_Proc old + old = GC_collect_end_callback; + GC_collect_end_callback = func; + return old +} + static long roots_count; static long roots_size; static unsigned long *roots; diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index 6eaba89dff..2d1fd56220 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -892,9 +892,6 @@ typedef struct Scheme_Thread_Memory { Scheme_Thread_Memory *tm_start, *tm_next; -extern MZ_DLLIMPORT void (*GC_collect_start_callback)(void); -extern MZ_DLLIMPORT void (*GC_collect_end_callback)(void); - void scheme_init_thread_memory() { #ifndef MZ_PRECISE_GC @@ -915,8 +912,8 @@ void scheme_init_thread_memory() #endif /* scheme_init_thread() will replace these: */ - GC_collect_start_callback = scheme_suspend_remembered_threads; - GC_collect_end_callback = scheme_resume_remembered_threads; + GC_set_collect_start_callback(scheme_suspend_remembered_threads); + GC_set_collect_end_callback(scheme_resume_remembered_threads); } Scheme_Thread_Memory *scheme_remember_thread(void *t, int autoclose) diff --git a/src/mzscheme/src/salloc.c b/src/mzscheme/src/salloc.c index 175f0748fc..db5e8a50a8 100644 --- a/src/mzscheme/src/salloc.c +++ b/src/mzscheme/src/salloc.c @@ -2053,7 +2053,7 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[]) scheme_console_printf(" swapped in\n"); var_stack = GC_variable_stack; delta = 0; - limit = (void *)GC_get_thread_stack_base(); + limit = (void *)scheme_get_current_thread_stack_start(); } else { scheme_console_printf(" swapped out\n"); var_stack = (void **)t->jmpup_buf.gc_var_stack; diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index ea2669aa44..adbc13f86d 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -200,10 +200,6 @@ Scheme_Object *scheme_break_enabled_key; long scheme_total_gc_time; static long start_this_gc_time, end_this_gc_time; -#ifndef MZ_PRECISE_GC -extern MZ_DLLIMPORT void (*GC_collect_start_callback)(void); -extern MZ_DLLIMPORT void (*GC_collect_end_callback)(void); -#endif static void get_ready_for_GC(void); static void done_with_GC(void); #ifdef MZ_PRECISE_GC @@ -437,7 +433,7 @@ extern BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID reserved); #endif #ifdef MZ_PRECISE_GC -static unsigned long get_current_stack_start(void); +unsigned long scheme_get_current_thread_stack_start(void); #endif /*========================================================================*/ @@ -2106,10 +2102,10 @@ static Scheme_Thread *make_thread(Scheme_Config *config, thread_swap_callbacks = scheme_null; thread_swap_out_callbacks = scheme_null; - GC_collect_start_callback = get_ready_for_GC; - GC_collect_end_callback = done_with_GC; + GC_set_collect_start_callback(get_ready_for_GC); + GC_set_collect_end_callback(done_with_GC); #ifdef MZ_PRECISE_GC - GC_collect_inform_callback = inform_GC; + GC_set_collect_inform_callback(inform_GC); #endif #ifdef LINK_EXTENSIONS_BY_TABLE @@ -2118,7 +2114,7 @@ static Scheme_Thread *make_thread(Scheme_Config *config, #endif #if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC) - GC_get_thread_stack_base = get_current_stack_start; + GC_set_get_thread_stack_base(scheme_get_current_thread_stack_start); #endif process->stack_start = stack_base; @@ -7448,7 +7444,7 @@ Scheme_Jumpup_Buf_Holder *scheme_new_jmpupbuf_holder(void) } #ifdef MZ_PRECISE_GC -static unsigned long get_current_stack_start(void) +unsigned long scheme_get_current_thread_stack_start(void) { Scheme_Thread *p; p = scheme_current_thread;