| 
									
										
										
										
											2014-12-16 21:38:14 -08:00
										 |  |  | // Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-08 20:15:08 -04:00
										 |  |  | #include "common/thread.h"
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | #ifdef __APPLE__
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #include <mach/mach.h>
 | 
					
						
							| 
									
										
										
										
											2014-09-02 22:05:45 -07:00
										 |  |  | #elif defined(_WIN32)
 | 
					
						
							| 
									
										
										
										
											2016-12-03 21:08:02 +01:00
										 |  |  | #include <windows.h>
 | 
					
						
							| 
									
										
										
										
											2015-06-20 22:45:15 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2016-10-10 02:25:19 +00:00
										 |  |  | #if defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #include <pthread_np.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #include <pthread.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #include <sched.h>
 | 
					
						
							| 
									
										
										
										
											2015-06-20 22:45:15 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef _WIN32
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 02:33:41 +00:00
										 |  |  | #ifdef __FreeBSD__
 | 
					
						
							|  |  |  | #define cpu_set_t cpuset_t
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | namespace Common { | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-29 19:59:14 -08:00
										 |  |  | #ifdef _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Sets the debugger-visible name of the current thread.
 | 
					
						
							| 
									
										
										
										
											2020-03-25 16:33:37 -03:00
										 |  |  | // Uses trick documented in:
 | 
					
						
							|  |  |  | // https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  | void SetCurrentThreadName(const char* name) { | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  |     static const DWORD MS_VC_EXCEPTION = 0x406D1388; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #pragma pack(push, 8)
 | 
					
						
							|  |  |  |     struct THREADNAME_INFO { | 
					
						
							|  |  |  |         DWORD dwType;     // must be 0x1000
 | 
					
						
							|  |  |  |         LPCSTR szName;    // pointer to name (in user addr space)
 | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  |         DWORD dwThreadID; // thread ID (-1=caller thread)
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |         DWORD dwFlags;    // reserved for future use, must be zero
 | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  |     } info; | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #pragma pack(pop)
 | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     info.dwType = 0x1000; | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  |     info.szName = name; | 
					
						
							| 
									
										
										
										
											2020-03-25 16:33:37 -03:00
										 |  |  |     info.dwThreadID = std::numeric_limits<DWORD>::max(); | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  |     info.dwFlags = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  |     __try { | 
					
						
							|  |  |  |         RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); | 
					
						
							|  |  |  |     } __except (EXCEPTION_CONTINUE_EXECUTION) { | 
					
						
							| 
									
										
										
										
											2014-04-01 18:20:08 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-19 08:49:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | #else // !MSVC_VER, so must be POSIX threads
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | // MinGW with the POSIX threading model does not support pthread_setname_np
 | 
					
						
							| 
									
										
										
										
											2014-12-29 19:59:14 -08:00
										 |  |  | #if !defined(_WIN32) || defined(_MSC_VER)
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  | void SetCurrentThreadName(const char* name) { | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | #ifdef __APPLE__
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  |     pthread_setname_np(name); | 
					
						
							| 
									
										
										
										
											2016-10-10 02:25:19 +00:00
										 |  |  | #elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  |     pthread_set_name_np(pthread_self(), name); | 
					
						
							| 
									
										
										
										
											2016-10-10 02:25:19 +00:00
										 |  |  | #elif defined(__NetBSD__)
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  |     pthread_setname_np(pthread_self(), "%s", (void*)name); | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2018-11-21 21:53:35 -05:00
										 |  |  |     pthread_setname_np(pthread_self(), name); | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Common
 |