From a0fe34b01f85b5354595b1c77f395c85f63e0026 Mon Sep 17 00:00:00 2001 From: psucien Date: Sat, 15 Jun 2024 10:28:51 +0200 Subject: [PATCH] tracy: added PthreadMutex markup --- src/common/debug.h | 3 +++ src/core/libraries/kernel/thread_management.cpp | 15 +++++++++++++++ src/core/libraries/kernel/thread_management.h | 2 ++ 3 files changed, 20 insertions(+) diff --git a/src/common/debug.h b/src/common/debug.h index ea1dff7d..f9974228 100644 --- a/src/common/debug.h +++ b/src/common/debug.h @@ -51,4 +51,7 @@ enum MarkersPallete : int { #define GPU_SCOPE_LOCATION(name, color) \ tracy::SourceLocationData{name, TracyFunction, TracyFile, (uint32_t)TracyLine, color}; +#define MUTEX_LOCATION(name) \ + tracy::SourceLocationData{nullptr, name, TracyFile, (uint32_t)TracyLine, 0}; + #define FRAME_END FrameMark diff --git a/src/core/libraries/kernel/thread_management.cpp b/src/core/libraries/kernel/thread_management.cpp index 0d427ad1..ae4f7582 100644 --- a/src/core/libraries/kernel/thread_management.cpp +++ b/src/core/libraries/kernel/thread_management.cpp @@ -429,7 +429,11 @@ int PS4_SYSV_ABI scePthreadMutexInit(ScePthreadMutex* mutex, const ScePthreadMut int result = pthread_mutex_init(&(*mutex)->pth_mutex, &(*attr)->pth_mutex_attr); + static auto mutex_loc = MUTEX_LOCATION("mutex"); + (*mutex)->tracy_lock = std::make_unique(&mutex_loc); + if (name != nullptr) { + (*mutex)->tracy_lock->CustomName(name, std::strlen(name)); LOG_INFO(Kernel_Pthread, "name={}, result={}", name, result); } @@ -541,10 +545,15 @@ int PS4_SYSV_ABI scePthreadMutexLock(ScePthreadMutex* mutex) { return SCE_KERNEL_ERROR_EINVAL; } + (*mutex)->tracy_lock->BeforeLock(); + int result = pthread_mutex_lock(&(*mutex)->pth_mutex); if (result != 0) { LOG_TRACE(Kernel_Pthread, "Locked name={}, result={}", (*mutex)->name, result); } + + (*mutex)->tracy_lock->AfterLock(); + switch (result) { case 0: return SCE_OK; @@ -569,6 +578,9 @@ int PS4_SYSV_ABI scePthreadMutexUnlock(ScePthreadMutex* mutex) { if (result != 0) { LOG_TRACE(Kernel_Pthread, "Unlocking name={}, result={}", (*mutex)->name, result); } + + (*mutex)->tracy_lock->AfterUnlock(); + switch (result) { case 0: return SCE_OK; @@ -1099,6 +1111,9 @@ int PS4_SYSV_ABI scePthreadMutexTrylock(ScePthreadMutex* mutex) { if (result != 0) { LOG_TRACE(Kernel_Pthread, "name={}, result={}", (*mutex)->name, result); } + + (*mutex)->tracy_lock->AfterTryLock(result == 0); + switch (result) { case 0: return ORBIS_OK; diff --git a/src/core/libraries/kernel/thread_management.h b/src/core/libraries/kernel/thread_management.h index 1909ffd3..f7124cff 100644 --- a/src/core/libraries/kernel/thread_management.h +++ b/src/core/libraries/kernel/thread_management.h @@ -9,6 +9,7 @@ #include #include #include +#include "common/debug.h" #include "common/types.h" namespace Core::Loader { @@ -72,6 +73,7 @@ struct PthreadMutexInternal { u8 reserved[256]; std::string name; pthread_mutex_t pth_mutex; + std::unique_ptr tracy_lock; }; struct PthreadMutexattrInternal {