From 831bac8ee3b600760e5377d1c6591d3063bab378 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Tue, 24 Nov 2009 14:58:40 +0000 Subject: [PATCH] put/getenv performance fix attempt svn: r17043 --- src/mzscheme/src/string.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/mzscheme/src/string.c b/src/mzscheme/src/string.c index 2408d86da3..19a0beaed5 100644 --- a/src/mzscheme/src/string.c +++ b/src/mzscheme/src/string.c @@ -383,7 +383,6 @@ scheme_init_string (Scheme_Env *env) platform_3m_path = scheme_make_path(SCHEME_PLATFORM_LIBRARY_SUBPATH MZ3M_SUBDIR); REGISTER_SO(putenv_str_table); - putenv_str_table = scheme_make_hash_table(SCHEME_hash_string); REGISTER_SO(embedding_banner); REGISTER_SO(current_locale_name); @@ -1980,8 +1979,12 @@ int scheme_any_string_has_null(Scheme_Object *o) } } +/***********************************************************************/ +/* Environment Variables */ +/***********************************************************************/ + #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) -static char* clone_str_with_gc(char* buffer) { +static char* clone_str_with_gc(const char* buffer) { int length; char *newbuffer; length = strlen(buffer); @@ -1991,16 +1994,24 @@ static char* clone_str_with_gc(char* buffer) { } #endif +static void create_putenv_str_table_if_needed() { + if (!putenv_str_table) { + putenv_str_table = scheme_make_hash_table(SCHEME_hash_string); + } +} + #ifndef DOS_FILE_SYSTEM static void putenv_str_table_put_name(Scheme_Object *name, Scheme_Object *value) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) void *original_gc; Scheme_Object *name_copy; original_gc = GC_switch_to_master_gc(); - name_copy = clone_str_with_gc(name); + name_copy = (Scheme_Object *) clone_str_with_gc((Scheme_Object *) name); + create_putenv_str_table_if_needed(); scheme_hash_set(putenv_str_table, name_copy, value); GC_switch_back_from_master(original_gc); #else + create_putenv_str_table_if_needed(); scheme_hash_set(putenv_str_table, name, value); #endif } @@ -2013,11 +2024,13 @@ static void putenv_str_table_put_name_value(Scheme_Object *name, Scheme_Object * Scheme_Object *name_copy; Scheme_Object *value_copy; original_gc = GC_switch_to_master_gc(); - name_copy = clone_str_with_gc(name); - value_copy = clone_str_with_gc(value); + name_copy = (Scheme_Object *) clone_str_with_gc((Scheme_Object *) name); + value_copy = (Scheme_Object *) clone_str_with_gc((Scheme_Object *) value); + create_putenv_str_table_if_needed(); scheme_hash_set(putenv_str_table, name_copy, value_copy); GC_switch_back_from_master(original_gc); #else + create_putenv_str_table_if_needed(); scheme_hash_set(putenv_str_table, name, value); #endif } @@ -2029,10 +2042,12 @@ static Scheme_Object *putenv_str_table_get(Scheme_Object *name) { void *original_gc; Scheme_Object *value; original_gc = GC_switch_to_master_gc(); + create_putenv_str_table_if_needed(); value = scheme_hash_get(putenv_str_table, name); GC_switch_back_from_master(original_gc); return value; #else + create_putenv_str_table_if_needed(); return scheme_hash_get(putenv_str_table, name); #endif } @@ -2207,6 +2222,10 @@ static Scheme_Object *sch_putenv(int argc, Scheme_Object *argv[]) return rc ? scheme_false : scheme_true; } +/***********************************************************************/ +/* End Environment Variables */ +/***********************************************************************/ + static void machine_details(char *s); static Scheme_Object *system_type(int argc, Scheme_Object *argv[])