Commit 9300c3be authored by Nirbheek Chauhan's avatar Nirbheek Chauhan 🐜
Browse files

glib.recipe: Backport patch to set thread names on Windows 10

Part-of: <!672>
parent 71bc6341
Pipeline #256207 passed with stages
in 61 minutes and 6 seconds
......@@ -52,6 +52,8 @@ class Recipe(recipe.Recipe):
'glib/0001-glib-Use-g_getenv-everywhere-instead-of-getenv.patch',
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1771
'glib/0001-macos-fix-frexpl-checks-in-cross-compilation.patch',
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1884
'glib/0001-gthread-win32-Use-SetThreadDescription-Win32-API-for.patch',
]
files_libs = [
......
From 2fd36c88b86173e4ee577009c81eaf83d7ff2d16 Mon Sep 17 00:00:00 2001
From: Seungha Yang <seungha@centricular.com>
Date: Fri, 15 Jan 2021 01:21:51 +0900
Subject: [PATCH] gthread-win32: Use SetThreadDescription Win32 API for setting
thread name
Since Windows 10 1607, we can make use of SetThreadDescription() API
for setting thread name. Unlike previously used exception based
method, this API will preserve configured thread name on dump file.
---
glib/gthread-win32.c | 54 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 53 insertions(+), 1 deletion(-)
diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c
index 89df0da..8164835 100644
--- a/glib/gthread-win32.c
+++ b/glib/gthread-win32.c
@@ -536,10 +536,62 @@ SetThreadName (DWORD dwThreadID,
#endif
}
+typedef HRESULT (WINAPI *pSetThreadDescription) (HANDLE hThread,
+ PCWSTR lpThreadDescription);
+static pSetThreadDescription SetThreadDescriptionFunc = NULL;
+HMODULE kernel32_module = NULL;
+
+static gboolean
+g_thread_win32_load_library (void)
+{
+ /* FIXME: Add support for UWP app */
+#if !defined(G_WINAPI_ONLY_APP)
+ static volatile gsize _init_once = 0;
+ if (g_once_init_enter (&_init_once))
+ {
+ kernel32_module = LoadLibraryW (L"kernel32.dll");
+ if (kernel32_module)
+ {
+ SetThreadDescriptionFunc =
+ (pSetThreadDescription) GetProcAddress (kernel32_module,
+ "SetThreadDescription");
+ if (!SetThreadDescriptionFunc)
+ FreeLibrary (kernel32_module);
+ }
+ g_once_init_leave (&_init_once, 1);
+ }
+#endif
+
+ return !!SetThreadDescriptionFunc;
+}
+
+static gboolean
+g_thread_win32_set_thread_desc (const gchar *name)
+{
+ HRESULT hr;
+ wchar_t *namew;
+
+ if (!g_thread_win32_load_library () || !name)
+ return FALSE;
+
+ namew = g_utf8_to_utf16 (name, -1, NULL, NULL, NULL);
+ if (!namew)
+ return FALSE;
+
+ hr = SetThreadDescriptionFunc (GetCurrentThread (), namew);
+
+ g_free (namew);
+ return SUCCEEDED (hr);
+}
+
void
g_system_thread_set_name (const gchar *name)
{
- SetThreadName ((DWORD) -1, name);
+ /* Prefer SetThreadDescription over exception based way if available,
+ * since thread description set by SetThreadDescription will be preserved
+ * in dump file */
+ if (!g_thread_win32_set_thread_desc (name))
+ SetThreadName ((DWORD) -1, name);
}
/* {{{1 Epilogue */
--
2.29.2
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment