Browse Source

Add Linux support for SetThreadName (#823)

Terry Hendrix II 1 year ago
parent
commit
580748c2d9
1 changed files with 34 additions and 26 deletions
  1. 34 26
      Jolt/Core/JobSystemThreadPool.cpp

+ 34 - 26
Jolt/Core/JobSystemThreadPool.cpp

@@ -20,6 +20,9 @@
 
 	JPH_SUPPRESS_WARNING_POP
 #endif
+#ifdef JPH_PLATFORM_LINUX
+	#include <sys/prctl.h>
+#endif
 
 JPH_NAMESPACE_BEGIN
 
@@ -231,38 +234,43 @@ void JobSystemThreadPool::QueueJobs(Job **inJobs, uint inNumJobs)
 }
 
 #if defined(JPH_PLATFORM_WINDOWS) && !defined(JPH_COMPILER_MINGW) // MinGW doesn't support __try/__except
-
-// Sets the current thread name in MSVC debugger
-static void SetThreadName(const char *inName)
-{
-	#pragma pack(push, 8)
-
-	struct THREADNAME_INFO
+	// Sets the current thread name in MSVC debugger
+	static void SetThreadName(const char *inName)
 	{
-		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.
-	};
+		#pragma pack(push, 8)
 
-	#pragma pack(pop)
+		struct THREADNAME_INFO
+		{
+			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.
+		};
 
-	THREADNAME_INFO info;
-	info.dwType = 0x1000;
-	info.szName = inName;
-	info.dwThreadID = (DWORD)-1;
-	info.dwFlags = 0;
+		#pragma pack(pop)
 
-	__try
-	{
-		RaiseException(0x406D1388, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
+		THREADNAME_INFO info;
+		info.dwType = 0x1000;
+		info.szName = inName;
+		info.dwThreadID = (DWORD)-1;
+		info.dwFlags = 0;
+
+		__try
+		{
+			RaiseException(0x406D1388, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
+		}
+		__except(EXCEPTION_EXECUTE_HANDLER)
+		{
+		}
 	}
-	__except(EXCEPTION_EXECUTE_HANDLER)
+#elif defined(JPH_PLATFORM_LINUX)
+	static void SetThreadName(const char *inName)
 	{
+		char truncated_name[16] = { 0 };
+		strncpy(truncated_name, inName, min(sizeof(truncated_name), 15ul));
+		prctl(PR_SET_NAME, truncated_name, 0, 0, 0);
 	}
-}
-
-#endif // JPH_PLATFORM_WINDOWS && !JPH_COMPILER_MINGW
+#endif // JPH_PLATFORM_LINUX
 
 void JobSystemThreadPool::ThreadMain(int inThreadIndex)
 {
@@ -270,7 +278,7 @@ void JobSystemThreadPool::ThreadMain(int inThreadIndex)
 	char name[64];
 	snprintf(name, sizeof(name), "Worker %d", int(inThreadIndex + 1));
 
-#if defined(JPH_PLATFORM_WINDOWS) && !defined(JPH_COMPILER_MINGW)
+#if (defined(JPH_PLATFORM_WINDOWS) && !defined(JPH_COMPILER_MINGW)) || defined(JPH_PLATFORM_LINUX)
 	SetThreadName(name);
 #endif // JPH_PLATFORM_WINDOWS && !JPH_COMPILER_MINGW