Rémi Bernon : msvcrt: Introduce noalloc current locale lookup helpers.
Alexandre Julliard
julliard at winehq.org
Tue Nov 10 15:30:25 CST 2020
Module: wine
Branch: master
Commit: faf92fdedb16a6e35c556e389bf5ac7241058f75
URL: https://source.winehq.org/git/wine.git/?a=commit;h=faf92fdedb16a6e35c556e389bf5ac7241058f75
Author: Rémi Bernon <rbernon at 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 at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list