| 100 | static std::wstring _noname = L""; |
| 101 | |
| 102 | const wchar_t* |
| 103 | SK_Thread_QueryNameFromOS (DWORD dwTid) |
| 104 | { |
| 105 | if (_SK_UntitledThreads->find (dwTid) == _SK_UntitledThreads->cend ()) |
| 106 | { |
| 107 | SK_AutoHandle hThread ( |
| 108 | OpenThread ( THREAD_QUERY_LIMITED_INFORMATION, |
| 109 | FALSE, |
| 110 | dwTid ) ); |
| 111 | |
| 112 | if (hThread.isValid ()) |
| 113 | { |
| 114 | wchar_t *wszThreadName = nullptr; |
| 115 | if (SUCCEEDED (SK_GetThreadDescription (hThread, &wszThreadName))) |
| 116 | { |
| 117 | if ( wszThreadName != nullptr && |
| 118 | *wszThreadName != L'\0' ) // Empty strings are not useful :) |
| 119 | { |
| 120 | auto name = |
| 121 | _SK_ThreadNames.get()[dwTid].data(); |
| 122 | |
| 123 | __make_self_titled (dwTid); |
| 124 | wcsncpy_s (name, SK_MAX_THREAD_NAME_LEN, wszThreadName, _TRUNCATE); |
| 125 | |
| 126 | LocalFree (wszThreadName); |
| 127 | |
| 128 | return name; |
| 129 | } |
| 130 | |
| 131 | LocalFree (wszThreadName); |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | _SK_UntitledThreads->insert (dwTid); |
| 136 | } |
| 137 | |
| 138 | return |
| 139 | L""; |
| 140 | } |
| 141 | |
| 142 | DWORD |
| 143 | SK_Thread_FindByName (std::wstring name) |
no test coverage detected