[PATCH vkd3d v3 1/7] vkd3d: Fix pthread_setname_np(3) call on Mac OS.
Chip Davis
cdavis at codeweavers.com
Fri Aug 10 16:01:28 CDT 2018
That function exists on Mac, but it only takes a single argument, the
thread's new name. That's OK for our purposes, since we were calling it
on pthread_self anyhow.
Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
Notes:
Try 2: Pull the pthread_setname_np(3) call into a header.
Try 3: Detect which variant of pthread_setname_np(3) we have at
configure time.
configure.ac | 28 ++++++++++++++++++++++++++++
libs/vkd3d/command.c | 4 +---
libs/vkd3d/vkd3d_private.h | 11 +++++++++++
3 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 2773a15..973105b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,6 +94,34 @@ VKD3D_CHECK_FUNC([HAVE_SYNC_ADD_AND_FETCH], [__sync_add_and_fetch], [__sync_add_
VKD3D_CHECK_FUNC([HAVE_SYNC_SUB_AND_FETCH], [__sync_sub_and_fetch], [__sync_sub_and_fetch((int *)0, 0)])
VKD3D_CHECK_LIB_FUNCS([pthread_setname_np], [$PTHREAD_LIBS])
+AS_IF([test "x$ac_cv_func_pthread_setname_np" = xyes],
+ [AC_MSG_CHECKING([which variant of pthread_setname_np is present])
+ AC_CACHE_VAL([vkd3d_cv_pthread_setname_np_variant],
+ [vkd3d_cv_pthread_setname_np_variant=unknown
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [#ifdef HAVE_PTHREAD_H
+ #include <pthread.h>
+ #endif
+ ],
+ [pthread_setname_np(pthread_self(), "conftest");])],
+ [vkd3d_cv_pthread_setname_np_variant=twoarg],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [#ifdef HAVE_PTHREAD_H
+ #include <pthread.h>
+ #endif
+ ],
+ [pthread_setname_np("conftest");])],
+ [vkd3d_cv_pthread_setname_np_variant=onearg])])])
+ AS_CASE(["$vkd3d_cv_pthread_setname_np_variant"],
+ [onearg],
+ [AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_ONEARG], [1],
+ [Define to 1 if you have the version of pthread_setname_np(3) that only accepts a name.])
+ AC_MSG_RESULT([name only])],
+ [twoarg],
+ [AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_TWOARG], [1],
+ [Define to 1 if you have the version of pthread_setname_np(3) that accepts a pthread handle and name.])
+ AC_MSG_RESULT([pthread handle and name])],
+ [AC_MSG_RESULT([unknown])])])
AM_CONDITIONAL([HAVE_WIDL], [test "x$WIDL" != "xno"])
AM_CONDITIONAL([HAVE_CROSSTARGET32], [test "x$CROSSTARGET32" != "xno"])
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 4db9967..042d2f1 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -199,9 +199,7 @@ static void *vkd3d_fence_worker_main(void *arg)
struct vkd3d_fence_worker *worker = arg;
int rc;
-#ifdef HAVE_PTHREAD_SETNAME_NP
- pthread_setname_np(pthread_self(), "vkd3d_worker");
-#endif
+ vkd3d_set_thread_name("vkd3d_worker");
for (;;)
{
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 8efb930..ca9fbaf 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -86,6 +86,17 @@ struct vkd3d_vulkan_info
VkPhysicalDeviceSparseProperties sparse_properties;
};
+static inline void vkd3d_set_thread_name(const char *name)
+{
+#ifdef HAVE_PTHREAD_SETNAME_NP
+#ifdef HAVE_PTHREAD_SETNAME_NP_ONEARG
+ pthread_setname_np(name);
+#elif defined(HAVE_PTHREAD_SETNAME_NP_TWOARG)
+ pthread_setname_np(pthread_self(), name);
+#endif
+#endif
+}
+
struct vkd3d_instance
{
VkInstance vk_instance;
--
2.18.0
More information about the wine-devel
mailing list