summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorJames Ross-Gowan <rossymiles@gmail.com>2017-05-17 23:33:35 +1000
committerJames Ross-Gowan <rossymiles@gmail.com>2017-05-18 00:11:14 +1000
commitbc381dd05e654d106b6cb4d7d94b27b9afe2bf30 (patch)
treeb342778416921a944b24be721b7aed729b48ff0d /osdep
parent6a000598504b60a198236eae93f08801dd6ebeb7 (diff)
downloadmpv-bc381dd05e654d106b6cb4d7d94b27b9afe2bf30.tar.bz2
mpv-bc381dd05e654d106b6cb4d7d94b27b9afe2bf30.tar.xz
win32: pthread: use the new thread naming API
Windows, as of the Creators Update, finally has a sane API for giving a name to a thread that can be used by debuggers. This is similar to pthread_setname_np on Linux and some Unixes. Expose it in the pthread wrapper and use it for mpthread_set_name().
Diffstat (limited to 'osdep')
-rw-r--r--osdep/threads.c2
-rw-r--r--osdep/win32/include/pthread.h3
-rw-r--r--osdep/win32/pthread.c23
3 files changed, 27 insertions, 1 deletions
diff --git a/osdep/threads.c b/osdep/threads.c
index e4bd0b7758..53d332396d 100644
--- a/osdep/threads.c
+++ b/osdep/threads.c
@@ -47,7 +47,7 @@ void mpthread_set_name(const char *name)
tname[15] = '\0'; // glibc-checked kernel limit
pthread_setname_np(pthread_self(), tname);
}
-#elif HAVE_BSD_THREAD_NAME
+#elif HAVE_WIN32_INTERNAL_PTHREADS || HAVE_BSD_THREAD_NAME
pthread_set_name_np(pthread_self(), tname);
#elif HAVE_NETBSD_THREAD_NAME
pthread_setname_np(pthread_self(), "%s", (void *)tname);
diff --git a/osdep/win32/include/pthread.h b/osdep/win32/include/pthread.h
index 870e9d7d5c..271cae0f0a 100644
--- a/osdep/win32/include/pthread.h
+++ b/osdep/win32/include/pthread.h
@@ -33,6 +33,7 @@
#define pthread_join m_pthread_join
#define pthread_detach m_pthread_detach
#define pthread_create m_pthread_create
+#define pthread_set_name_np m_pthread_set_name_np
#define pthread_once_t INIT_ONCE
#define PTHREAD_ONCE_INIT INIT_ONCE_STATIC_INIT
@@ -97,4 +98,6 @@ int pthread_detach(pthread_t thread);
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
+void pthread_set_name_np(pthread_t thread, const char *name);
+
#endif
diff --git a/osdep/win32/pthread.c b/osdep/win32/pthread.c
index 4f42cc3cd4..57a9d85810 100644
--- a/osdep/win32/pthread.c
+++ b/osdep/win32/pthread.c
@@ -196,6 +196,29 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
return 0;
}
+void pthread_set_name_np(pthread_t thread, const char *name)
+{
+ HMODULE kernel32 = GetModuleHandleW(L"kernel32.dll");
+ if (!kernel32)
+ return;
+ HRESULT (WINAPI *pSetThreadDescription)(HANDLE, PCWSTR) =
+ (void*)GetProcAddress(kernel32, "SetThreadDescription");
+ if (!pSetThreadDescription)
+ return;
+
+ HANDLE th = OpenThread(THREAD_SET_LIMITED_INFORMATION, FALSE, thread.id);
+ if (!th)
+ return;
+ wchar_t wname[80];
+ int wc = MultiByteToWideChar(CP_UTF8, 0, name, -1, wname,
+ sizeof(wname) / sizeof(wchar_t) - 1);
+ if (wc > 0) {
+ wname[wc] = L'\0';
+ pSetThreadDescription(th, wname);
+ }
+ CloseHandle(th);
+}
+
int sem_init(sem_t *sem, int pshared, unsigned int value)
{
if (pshared)