From faf92fdedb16a6e35c556e389bf5ac7241058f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Tue, 10 Nov 2020 16:58:49 +0100 Subject: [PATCH] msvcrt: Introduce noalloc current locale lookup helpers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/msvcrt/locale.c | 34 +++++++++++++++++++++++++++------- dlls/msvcrt/msvcrt.h | 2 ++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index f25c1228d2f..c49439951a9 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -953,6 +953,31 @@ void free_mbcinfo(MSVCRT_pthreadmbcinfo mbcinfo) MSVCRT_free(mbcinfo); } +MSVCRT__locale_t CDECL get_current_locale_noalloc(MSVCRT__locale_t locale) +{ + thread_data_t *data = msvcrt_get_thread_data(); + + if(!data || !data->have_locale) + { + *locale = *MSVCRT_locale; + } + else + { + locale->locinfo = data->locinfo; + locale->mbcinfo = data->mbcinfo; + } + + InterlockedIncrement(&locale->locinfo->refcount); + InterlockedIncrement(&locale->mbcinfo->refcount); + return locale; +} + +void CDECL free_locale_noalloc(MSVCRT__locale_t locale) +{ + free_locinfo(locale->locinfo); + free_mbcinfo(locale->mbcinfo); +} + /********************************************************************* * _get_current_locale (MSVCRT.@) */ @@ -962,11 +987,7 @@ MSVCRT__locale_t CDECL MSVCRT__get_current_locale(void) if(!loc) return NULL; - loc->locinfo = get_locinfo(); - loc->mbcinfo = get_mbcinfo(); - InterlockedIncrement(&loc->locinfo->refcount); - InterlockedIncrement(&loc->mbcinfo->refcount); - return loc; + return get_current_locale_noalloc(loc); } /********************************************************************* @@ -977,8 +998,7 @@ void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale) if (!locale) return; - free_locinfo(locale->locinfo); - free_mbcinfo(locale->mbcinfo); + free_locale_noalloc(locale); MSVCRT_free(locale); } diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index f73117ae5e2..07a2f3d33e8 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -1128,6 +1128,8 @@ int __cdecl MSVCRT__set_printf_count_output(int); #define MSVCRT__DISABLE_PER_THREAD_LOCALE 2 extern MSVCRT__locale_t MSVCRT_locale; +MSVCRT__locale_t CDECL get_current_locale_noalloc(MSVCRT__locale_t locale) DECLSPEC_HIDDEN; +void CDECL free_locale_noalloc(MSVCRT__locale_t locale) DECLSPEC_HIDDEN; MSVCRT_pthreadlocinfo CDECL get_locinfo(void) DECLSPEC_HIDDEN; MSVCRT_pthreadmbcinfo CDECL get_mbcinfo(void) DECLSPEC_HIDDEN; void __cdecl MSVCRT__free_locale(MSVCRT__locale_t);