diff --git a/src/mzscheme/include/schthread.h b/src/mzscheme/include/schthread.h index 7d49a5552a..daa47e1a72 100644 --- a/src/mzscheme/include/schthread.h +++ b/src/mzscheme/include/schthread.h @@ -216,6 +216,7 @@ typedef struct Thread_Local_Variables { unsigned long current_total_allocation_; struct gmp_tmp_stack gmp_tmp_xxx_; struct gmp_tmp_stack *gmp_tmp_current_; + struct Scheme_Logger *scheme_main_logger_; } Thread_Local_Variables; #if defined(IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS) @@ -398,6 +399,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define current_total_allocation XOA (scheme_get_thread_local_variables()->current_total_allocation_) #define gmp_tmp_xxx XOA (scheme_get_thread_local_variables()->gmp_tmp_xxx_) #define gmp_tmp_current XOA (scheme_get_thread_local_variables()->gmp_tmp_current_) +#define scheme_main_logger XOA (scheme_get_thread_local_variables()->scheme_main_logger_) /* **************************************** */ diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index c98945537b..312af4e013 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -439,6 +439,7 @@ static Scheme_Env *place_instance_init_post_kernel() { } scheme_init_error_escape_proc(NULL); scheme_init_print_buffers_places(); + scheme_init_logger(); scheme_init_eval_places(); scheme_init_regexp_places(); scheme_init_stx_places(); @@ -453,6 +454,7 @@ static Scheme_Env *place_instance_init_post_kernel() { scheme_init_port_config(); scheme_init_port_fun_config(); scheme_init_error_config(); + scheme_init_logger_config(); #ifndef NO_SCHEME_EXNS scheme_init_exn_config(); #endif diff --git a/src/mzscheme/src/error.c b/src/mzscheme/src/error.c index dd0e2ea92f..5f72cf30ef 100644 --- a/src/mzscheme/src/error.c +++ b/src/mzscheme/src/error.c @@ -50,8 +50,7 @@ void (*scheme_console_output)(char *str, long len); static int init_syslog_level = INIT_SYSLOG_LEVEL; static int init_stderr_level = SCHEME_LOG_ERROR; -Scheme_Logger *scheme_main_logger; -static void init_logger_config(); +THREAD_LOCAL_DECL(static Scheme_Logger *scheme_main_logger); /* readonly globals */ const char *scheme_compile_stx_string = "compile"; @@ -589,7 +588,13 @@ void scheme_init_error(Scheme_Env *env) scheme_add_evt(scheme_log_reader_type, (Scheme_Ready_Fun)log_reader_get, NULL, NULL, 1); REGISTER_SO(scheme_def_exit_proc); + REGISTER_SO(default_display_handler); + REGISTER_SO(emergency_display_handler); + scheme_def_exit_proc = scheme_make_prim_w_arity(def_exit_handler_proc, "default-exit-handler", 1, 1); + default_display_handler = scheme_make_prim_w_arity(def_error_display_proc, "default-error-display-handler", 2, 2); + emergency_display_handler = scheme_make_prim_w_arity(emergency_error_display_proc, "emergency-error-display-handler", 2, 2); + REGISTER_SO(def_err_val_proc); def_err_val_proc = scheme_make_prim_w_arity(def_error_value_string_proc, "default-error-value->string-handler", 2, 2); @@ -605,14 +610,6 @@ void scheme_init_error(Scheme_Env *env) info_symbol = scheme_intern_symbol("info"); debug_symbol = scheme_intern_symbol("debug"); - { - REGISTER_SO(scheme_main_logger); - scheme_main_logger = make_a_logger(NULL, NULL); - scheme_main_logger->syslog_level = init_syslog_level; - scheme_main_logger->stderr_level = init_stderr_level; - } - init_logger_config(); - REGISTER_SO(arity_property); { Scheme_Object *guard; @@ -625,27 +622,29 @@ void scheme_init_error(Scheme_Env *env) scheme_init_error_config(); } -static void init_logger_config() +void scheme_init_logger() { - scheme_set_root_param(MZCONFIG_LOGGER, (Scheme_Object *)scheme_main_logger); + REGISTER_SO(scheme_main_logger); + scheme_main_logger = make_a_logger(NULL, NULL); + scheme_main_logger->syslog_level = init_syslog_level; + scheme_main_logger->stderr_level = init_stderr_level; +} + +Scheme_Logger *scheme_get_main_logger() { + return scheme_main_logger; } void scheme_init_error_config(void) { - init_logger_config(); - scheme_set_root_param(MZCONFIG_EXIT_HANDLER, scheme_def_exit_proc); - - REGISTER_SO(default_display_handler); - REGISTER_SO(emergency_display_handler); - - default_display_handler = scheme_make_prim_w_arity(def_error_display_proc, "default-error-display-handler", 2, 2); - emergency_display_handler = scheme_make_prim_w_arity(emergency_error_display_proc, "emergency-error-display-handler", 2, 2); - scheme_set_root_param(MZCONFIG_ERROR_DISPLAY_HANDLER, default_display_handler); scheme_set_root_param(MZCONFIG_ERROR_PRINT_VALUE_HANDLER, def_err_val_proc); } +void scheme_init_logger_config() { + scheme_set_root_param(MZCONFIG_LOGGER, (Scheme_Object *)scheme_main_logger); +} + static void scheme_inescapeable_error(const char *a, const char *b) { diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index c7579f2353..ff26738435 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -235,6 +235,9 @@ void scheme_init_fun_places(void); void scheme_init_sema_places(void); void scheme_init_gmp_places(void); void scheme_init_print_global_constants(void); +void scheme_init_logger(void); +Scheme_Logger *scheme_get_main_logger(void); +void scheme_init_logger_config(void); void register_network_evts(); @@ -2944,8 +2947,6 @@ typedef struct Scheme_Log_Reader { Scheme_Object *head, *tail; } Scheme_Log_Reader; -extern Scheme_Logger *scheme_main_logger; - char *scheme_optimize_context_to_string(Scheme_Object *context); void scheme_write_proc_context(Scheme_Object *port, int print_width, diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index 780af68acb..86995727bc 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -7408,7 +7408,8 @@ static void done_with_GC() #ifdef MZ_PRECISE_GC static void inform_GC(int major_gc, long pre_used, long post_used) { - if (scheme_main_logger) { + Scheme_Logger *logger = scheme_get_main_logger(); + if (logger) { /* Don't use scheme_log(), because it wants to allocate a buffer based on the max value-print width, and we may not be at a point where parameters are available. */ @@ -7422,10 +7423,7 @@ static void inform_GC(int major_gc, long pre_used, long post_used) end_this_gc_time - start_this_gc_time); buflen = strlen(buf); - scheme_log_message(scheme_main_logger, - SCHEME_LOG_DEBUG, - buf, buflen, - NULL); + scheme_log_message(logger, SCHEME_LOG_DEBUG, buf, buflen, NULL); } }