diff --git a/src/racket/include/schthread.h b/src/racket/include/schthread.h index e9aab7a002..237ec1a9be 100644 --- a/src/racket/include/schthread.h +++ b/src/racket/include/schthread.h @@ -262,6 +262,7 @@ typedef struct Thread_Local_Variables { int env_uid_counter_; int scheme_overflow_count_; struct Scheme_Object *original_pwd_; + void *file_path_wc_buffer_; intptr_t scheme_hash_request_count_; intptr_t scheme_hash_iteration_count_; struct Scheme_Env *initial_modules_env_; @@ -579,6 +580,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define env_uid_counter XOA (scheme_get_thread_local_variables()->env_uid_counter_) #define scheme_overflow_count XOA (scheme_get_thread_local_variables()->scheme_overflow_count_) #define original_pwd XOA (scheme_get_thread_local_variables()->original_pwd_) +#define file_path_wc_buffer XOA (scheme_get_thread_local_variables()->file_path_wc_buffer_) #define scheme_hash_request_count XOA (scheme_get_thread_local_variables()->scheme_hash_request_count_) #define scheme_hash_iteration_count XOA (scheme_get_thread_local_variables()->scheme_hash_iteration_count_) #define initial_modules_env XOA (scheme_get_thread_local_variables()->initial_modules_env_) diff --git a/src/racket/src/file.c b/src/racket/src/file.c index fa6a79a6a1..5db8f13f24 100644 --- a/src/racket/src/file.c +++ b/src/racket/src/file.c @@ -1153,7 +1153,7 @@ int scheme_os_setcwd(char *expanded, int noexn) #ifdef DOS_FILE_SYSTEM #define WC_BUFFER_SIZE 1024 -static wchar_t wc_buffer[WC_BUFFER_SIZE]; +THREAD_LOCAL_DECL(static void *file_path_wc_buffer); static int wc_strlen(const wchar_t *ws) { @@ -1174,9 +1174,13 @@ wchar_t *scheme_convert_to_wchar(const char *s, int do_copy) NULL, 0, -1, NULL, 1/*UTF-16*/, '\t'); - if (!do_copy && (len < (WC_BUFFER_SIZE-1))) - ws = wc_buffer; - else + if (!do_copy && (len < (WC_BUFFER_SIZE-1))) { + if (!file_path_wc_buffer) { + REGISTER_SO(file_path_wc_buffer); + file_path_wc_buffer = scheme_malloc_atomic(sizeof(wchar_t) * WC_BUFFER_SIZE); + } + ws = (wchar_t *)file_path_wc_buffer; + } else ws = (wchar_t *)scheme_malloc_atomic(sizeof(wchar_t) * (len + 1)); scheme_utf8_decode(s, 0, l, (unsigned int *)ws, 0, -1,