[Libreoffice-commits] core.git: sal/osl

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Wed Jun 2 13:27:46 UTC 2021


 sal/osl/w32/thread.cxx |   32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

New commits:
commit a5eba5fef0b6eade2c0a39f8e8fc90bdeb08dff2
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Wed Jun 2 11:05:21 2021 +0200
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Wed Jun 2 15:27:09 2021 +0200

    Make optional use of SetThreadDescription in osl_setThreadName
    
    ... so that thread name could appear in crash dumps, and be
    potentially available for logging on Windows 10 version 1607
    and later.
    
    Change-Id: I176ca1fce57e0532a226f85836b3889a8ffb2984
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116462
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/sal/osl/w32/thread.cxx b/sal/osl/w32/thread.cxx
index d4a9d6d67060..e269e7cbd455 100644
--- a/sal/osl/w32/thread.cxx
+++ b/sal/osl/w32/thread.cxx
@@ -358,25 +358,43 @@ void SAL_CALL osl_yieldThread(void)
     Sleep(0);
 }
 
+static void impSetThreadDescription(char const * name) {
+    // SetThreadDescription is only available since Windows 10 version 1607
+    typedef HRESULT(WINAPI * TSetThreadDescription)(HANDLE, PCWSTR);
+    static const auto pSetThreadDescription = reinterpret_cast<TSetThreadDescription>(
+        GetProcAddress(GetModuleHandleA("KernelBase.dll"), "SetThreadDescription"));
+    if (pSetThreadDescription)
+    {
+        if (const int nReqCCh = MultiByteToWideChar(CP_ACP, 0, name, -1, nullptr, 0))
+        {
+            if (PWSTR wStr = static_cast<PWSTR>(malloc(nReqCCh * sizeof(WCHAR))))
+            {
+                if (MultiByteToWideChar(CP_ACP, 0, name, -1, wStr, nReqCCh))
+                    pSetThreadDescription(GetCurrentThread(), wStr);
+                free(wStr);
+            }
+        }
+    }
+}
+
 void SAL_CALL osl_setThreadName(char const * name) {
-    /* See <http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx>: */
+    /* See < https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code >: */
 #pragma pack(push, 8)
     struct {
-        DWORD dwType;
+        DWORD dwType = 0x1000;
         LPCSTR szName;
-        DWORD dwThreadID;
-        DWORD dwFlags;
+        DWORD dwThreadID = DWORD(-1);
+        DWORD dwFlags = 0;
     } info;
 #pragma pack(pop)
-    info.dwType = 0x1000;
     info.szName = name;
-    info.dwThreadID = DWORD(-1);
-    info.dwFlags = 0;
     __try {
         RaiseException(
             0x406D1388, 0, sizeof info / sizeof (ULONG_PTR),
             reinterpret_cast<ULONG_PTR *>(&info));
     } __except (EXCEPTION_EXECUTE_HANDLER) {}
+
+    impSetThreadDescription(name);
 }
 
 namespace {


More information about the Libreoffice-commits mailing list