aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-10-26 12:39:19 -0700
committerChris Robinson <[email protected]>2013-10-26 12:39:19 -0700
commitff5277f4d7057f481a820cf64e2c2db4687bfd5f (patch)
tree8ad3dcfddc5354b25c74a96011e3532b724382ac
parent6617985a4ee765a86d9175e0e86197c03a8f1b8c (diff)
Add a method to set the running thread's name
-rw-r--r--Alc/helpers.c38
-rw-r--r--CMakeLists.txt12
-rw-r--r--OpenAL32/Include/alMain.h2
-rw-r--r--config.h.in6
4 files changed, 56 insertions, 2 deletions
diff --git a/Alc/helpers.c b/Alc/helpers.c
index 1eadc99c..43f03462 100644
--- a/Alc/helpers.c
+++ b/Alc/helpers.c
@@ -269,6 +269,44 @@ void RestoreFPUMode(const FPUCtl *ctl)
}
+void SetThreadName(const char *name)
+{
+#if defined(HAVE_PTHREAD_SETNAME_NP)
+#if defined(__GNUC__)
+ if(pthread_setname_np(pthread_self(), name) != 0)
+#elif defined(__APPLE__)
+ if(pthread_setname_np(name) != 0)
+#endif
+ ERR("Failed to set thread name to \"%s\": %s\n", name, strerror(errno));
+#elif defined(HAVE_PTHREAD_SET_NAME_NP)
+ pthread_set_name_np(pthread_self(), name);
+#elif defined(_MSC_VER)
+#define MS_VC_EXCEPTION 0x406D1388
+ struct {
+ DWORD dwType; // Must be 0x1000.
+ LPCSTR szName; // Pointer to name (in user addr space).
+ DWORD dwThreadID; // Thread ID (-1=caller thread).
+ DWORD dwFlags; // Reserved for future use, must be zero.
+ } info;
+ info.dwType = 0x1000;
+ info.szName = name;
+ info.dwThreadID = -1;
+ info.dwFlags = 0;
+
+ __try
+ {
+ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info);
+ }
+ __except(EXCEPTION_CONTINUE_EXECUTION)
+ {
+ }
+#undef MS_VC_EXCEPTION
+#else
+ WARN("Can't set thread name to \"%s\"\n", name);
+#endif
+}
+
+
#ifdef _WIN32
void pthread_once(pthread_once_t *once, void (*callback)(void))
{
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ec1d4860..9ed65804 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -418,21 +418,29 @@ IF(NOT HAVE_WINDOWS_H)
# Some systems need pthread_np.h to get recursive mutexes
CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
- CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
-
CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
IF(HAVE_PTHREAD)
ADD_DEFINITIONS(-pthread)
+ SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
ENDIF()
# _GNU_SOURCE is needed on some systems for extra attributes
ADD_DEFINITIONS(-D_GNU_SOURCE=1)
+ SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1")
+
CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
IF(HAVE_LIBPTHREAD)
SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
ENDIF()
+ CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
+
+ CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
+ IF(NOT HAVE_PTHREAD_SETNAME_NP)
+ CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
+ ENDIF()
+
CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
IF(HAVE_LIBRT)
SET(EXTRA_LIBS rt ${EXTRA_LIBS})
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 11a1e78c..d8dbdcd9 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -813,6 +813,8 @@ void RestoreFPUMode(const FPUCtl *ctl);
ALvoid *StartThread(ALuint (*func)(ALvoid*), ALvoid *ptr);
ALuint StopThread(ALvoid *thread);
+void SetThreadName(const char *name);
+
typedef struct RingBuffer RingBuffer;
RingBuffer *CreateRingBuffer(ALsizei frame_size, ALsizei length);
void DestroyRingBuffer(RingBuffer *ring);
diff --git a/config.h.in b/config.h.in
index 81d5e1f4..0be494d3 100644
--- a/config.h.in
+++ b/config.h.in
@@ -139,3 +139,9 @@
/* Define if we have pthread_setschedparam() */
#cmakedefine HAVE_PTHREAD_SETSCHEDPARAM
+
+/* Define if we have pthread_setname_np() */
+#cmakedefine HAVE_PTHREAD_SETNAME_NP
+
+/* Define if we have pthread_set_name_np() */
+#cmakedefine HAVE_PTHREAD_SET_NAME_NP