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