Use GetThreadDescription on Windows
Windows 10 introduced SetThreadDescription and GetThreadDescription, a simpler way to set a thread's name. This changes gdb and gdbserver to use this convention when it is available. This is part of PR win32/29050. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29050
This commit is contained in:
parent
1ea519ec19
commit
8bbdbd6985
4 changed files with 47 additions and 3 deletions
|
@ -58,6 +58,10 @@ Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry;
|
|||
#endif
|
||||
GenerateConsoleCtrlEvent_ftype *GenerateConsoleCtrlEvent;
|
||||
|
||||
#define GetThreadDescription dyn_GetThreadDescription
|
||||
typedef HRESULT WINAPI (GetThreadDescription_ftype) (HANDLE, PWSTR *);
|
||||
static GetThreadDescription_ftype *GetThreadDescription;
|
||||
|
||||
/* Note that 'debug_events' must be locally defined in the relevant
|
||||
functions. */
|
||||
#define DEBUG_EVENTS(fmt, ...) \
|
||||
|
@ -106,6 +110,29 @@ windows_thread_info::resume ()
|
|||
suspended = 0;
|
||||
}
|
||||
|
||||
const char *
|
||||
windows_thread_info::thread_name ()
|
||||
{
|
||||
if (GetThreadDescription != nullptr)
|
||||
{
|
||||
PWSTR value;
|
||||
HRESULT result = GetThreadDescription (h, &value);
|
||||
if (SUCCEEDED (result))
|
||||
{
|
||||
size_t needed = wcstombs (nullptr, value, 0);
|
||||
if (needed != (size_t) -1)
|
||||
{
|
||||
name.reset ((char *) xmalloc (needed));
|
||||
if (wcstombs (name.get (), value, needed) == (size_t) -1)
|
||||
name.reset ();
|
||||
}
|
||||
LocalFree (value);
|
||||
}
|
||||
}
|
||||
|
||||
return name.get ();
|
||||
}
|
||||
|
||||
/* Return the name of the DLL referenced by H at ADDRESS. UNICODE
|
||||
determines what sort of string is read from the inferior. Returns
|
||||
the name of the DLL, or NULL on error. If a name is returned, it
|
||||
|
@ -662,6 +689,7 @@ initialize_loadable ()
|
|||
GPA (hm, Wow64GetThreadSelectorEntry);
|
||||
#endif
|
||||
GPA (hm, GenerateConsoleCtrlEvent);
|
||||
GPA (hm, GetThreadDescription);
|
||||
}
|
||||
|
||||
/* Set variables to dummy versions of these processes if the function
|
||||
|
@ -718,6 +746,15 @@ initialize_loadable ()
|
|||
OpenProcessToken = bad;
|
||||
}
|
||||
|
||||
/* On some versions of Windows, this function is only available in
|
||||
KernelBase.dll, not kernel32.dll. */
|
||||
if (GetThreadDescription == nullptr)
|
||||
{
|
||||
hm = LoadLibrary (TEXT ("KernelBase.dll"));
|
||||
if (hm)
|
||||
GPA (hm, GetThreadDescription);
|
||||
}
|
||||
|
||||
#undef GPA
|
||||
|
||||
return result;
|
||||
|
|
|
@ -51,6 +51,11 @@ struct windows_thread_info
|
|||
/* Resume the thread if it has been suspended. */
|
||||
void resume ();
|
||||
|
||||
/* Return the thread's name, or nullptr if not known. The name is
|
||||
stored in this thread and is guaranteed to live until at least
|
||||
the next call. */
|
||||
const char *thread_name ();
|
||||
|
||||
/* The Win32 thread identifier. */
|
||||
DWORD tid;
|
||||
|
||||
|
|
|
@ -2997,8 +2997,10 @@ windows_nat_target::get_ada_task_ptid (long lwp, ULONGEST thread)
|
|||
const char *
|
||||
windows_nat_target::thread_name (struct thread_info *thr)
|
||||
{
|
||||
return windows_process.thread_rec (thr->ptid,
|
||||
DONT_INVALIDATE_CONTEXT)->name.get ();
|
||||
windows_thread_info *th
|
||||
= windows_process.thread_rec (thr->ptid,
|
||||
DONT_INVALIDATE_CONTEXT);
|
||||
return th->thread_name ();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1508,7 +1508,7 @@ win32_process_target::thread_name (ptid_t thread)
|
|||
windows_thread_info *th
|
||||
= windows_process.thread_rec (current_thread_ptid (),
|
||||
DONT_INVALIDATE_CONTEXT);
|
||||
return th->name.get ();
|
||||
return th->thread_name ();
|
||||
}
|
||||
|
||||
/* The win32 target ops object. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue