diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index fd29182c39..d2a416209e 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3560,15 +3560,26 @@ std::pair thread_ctrl::get_thread_stack() u64 thread_ctrl::get_tid() { -#ifdef _WIN32 - return GetCurrentThreadId(); -#elif defined(ANDROID) - return static_cast(pthread_self()); -#elif defined(__linux__) - return syscall(SYS_gettid); -#else - return reinterpret_cast(pthread_self()); -#endif + static thread_local u64 s_tls_tid = []() -> u64 + { + #ifdef _WIN32 + return GetCurrentThreadId(); + #elif defined(ANDROID) + return pthread_gettid_np(pthread_self()); + #elif defined(__linux__) + return syscall(SYS_gettid); + #elif defined(__APPLE__) + u64 tid{}; + pthread_threadid_np(nullptr, &tid); + return tid; + #elif defined(__FreeBSD__) + return pthread_getthreadid_np(); + #else + return static_cast(pthread_self()); + #endif + }(); + + return s_tls_tid; } bool thread_ctrl::is_main() diff --git a/rpcs3/util/atomic.cpp b/rpcs3/util/atomic.cpp index 4fc0316206..9923325da2 100644 --- a/rpcs3/util/atomic.cpp +++ b/rpcs3/util/atomic.cpp @@ -186,9 +186,17 @@ namespace #ifdef _WIN32 tid = GetCurrentThreadId(); #elif defined(ANDROID) - tid = pthread_self(); + tid = pthread_gettid_np(pthread_self()); +#elif defined(__linux__) + tid = syscall(SYS_gettid); +#elif defined(__APPLE__) + u64 tid_temp{}; + pthread_threadid_np(nullptr, &tid_temp); + tid = tid_temp; // Use a temporary for extra safety +#elif defined(__FreeBSD__) + tid = pthread_getthreadid_np(); #else - tid = reinterpret_cast(pthread_self()); + tid = pthread_self(); #endif #ifdef USE_STD