Rémi Bernon : msvcrt: Introduce noalloc current locale lookup helpers.
Module: wine Branch: master Commit: faf92fdedb16a6e35c556e389bf5ac7241058f75 URL: https://source.winehq.org/git/wine.git/?a=commit;h=faf92fdedb16a6e35c556e389... Author: Rémi Bernon <rbernon(a)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(a)codeweavers.com> Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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);
participants (1)
-
Alexandre Julliard