Module: wine Branch: master Commit: faf92fdedb16a6e35c556e389bf5ac7241058f75 URL: https://source.winehq.org/git/wine.git/?a=commit;h=faf92fdedb16a6e35c556e389...
Author: Rémi Bernon rbernon@codeweavers.com Date: Tue Nov 10 16:58:49 2020 +0100
msvcrt: Introduce noalloc current locale lookup helpers.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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);