put/getenv performance fix attempt

svn: r17043
This commit is contained in:
Kevin Tew 2009-11-24 14:58:40 +00:00
parent 615744073c
commit 831bac8ee3

View File

@ -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[])