From ad686972ff9ce8880c668a7d37cd5b9d5b55185f Mon Sep 17 00:00:00 2001 From: offtkp Date: Wed, 27 Sep 2023 23:22:18 +0300 Subject: [PATCH] NIMATA! --- src/Core/PS4/HLE/LibKernel.cpp | 1 + src/Lib/Threads.cpp | 20 ++++++++++++-------- src/Lib/Threads.h | 15 +++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/Core/PS4/HLE/LibKernel.cpp b/src/Core/PS4/HLE/LibKernel.cpp index cc86aedb4..9d893c457 100644 --- a/src/Core/PS4/HLE/LibKernel.cpp +++ b/src/Core/PS4/HLE/LibKernel.cpp @@ -8,6 +8,7 @@ #include "Kernel/Objects/physical_memory.h" #include "Kernel/cpu_management.h" #include "Kernel/event_queues.h" +#include namespace HLE::Libs::LibKernel { diff --git a/src/Lib/Threads.cpp b/src/Lib/Threads.cpp index bd391f5e8..db28b9026 100644 --- a/src/Lib/Threads.cpp +++ b/src/Lib/Threads.cpp @@ -1,6 +1,7 @@ #include "Threads.h" #include +#include static std::thread::id g_main_thread; static int g_main_thread_int; @@ -55,25 +56,28 @@ Lib::Mutex::Mutex() { m_mutex = new MutexStructInternal(); } Lib::Mutex::~Mutex() { delete m_mutex; } -void Lib::Mutex::LockMutex() { EnterCriticalSection(&m_mutex->m_cs); } +void Lib::Mutex::LockMutex() { m_mutex->m_cs.lock(); } -void Lib::Mutex::UnlockMutex() { LeaveCriticalSection(&m_mutex->m_cs); } +void Lib::Mutex::UnlockMutex() { m_mutex->m_cs.unlock(); } -bool Lib::Mutex::TryLockMutex() { return (TryEnterCriticalSection(&m_mutex->m_cs) != 0); } +bool Lib::Mutex::TryLockMutex() { return m_mutex->m_cs.try_lock(); } Lib::ConditionVariable::ConditionVariable() { m_cond_var = new ConditionVariableStructInternal(); } Lib::ConditionVariable::~ConditionVariable() { delete m_cond_var; } -void Lib::ConditionVariable::WaitCondVar(Mutex* mutex) { SleepConditionVariableCS(&m_cond_var->m_cv, &mutex->m_mutex->m_cs, INFINITE); } +void Lib::ConditionVariable::WaitCondVar(Mutex* mutex) { + std::unique_lock lock(mutex->m_mutex->m_cs); + m_cond_var->m_cv.wait(lock); +} bool Lib::ConditionVariable::WaitCondVarFor(Mutex* mutex, u32 micros) { bool ok = false; - ok = !(SleepConditionVariableCS(&m_cond_var->m_cv, &mutex->m_mutex->m_cs, (micros < 1000 ? 1 : micros / 1000)) == 0 && - GetLastError() == ERROR_TIMEOUT); + std::unique_lock lock(mutex->m_mutex->m_cs); + ok = m_cond_var->m_cv.wait_for(lock, std::chrono::microseconds(micros)) == std::cv_status::no_timeout; return ok; } -void Lib::ConditionVariable::SignalCondVar() { WakeConditionVariable(&m_cond_var->m_cv); } +void Lib::ConditionVariable::SignalCondVar() { m_cond_var->m_cv.notify_one(); } -void Lib::ConditionVariable::SignalCondVarAll() { WakeAllConditionVariable(&m_cond_var->m_cv); } +void Lib::ConditionVariable::SignalCondVarAll() { m_cond_var->m_cv.notify_all(); } diff --git a/src/Lib/Threads.h b/src/Lib/Threads.h index 3773eaf59..c02721753 100644 --- a/src/Lib/Threads.h +++ b/src/Lib/Threads.h @@ -1,11 +1,10 @@ #pragma once -#include "windows.h" -#include #include #include #include #include +#include #include "../types.h" @@ -52,7 +51,7 @@ class Thread { }; struct ThreadStructInternal { - ThreadStructInternal(thread_func_t f, void* a) : func(f), arg(a), m_thread(&Run, this) {} + ThreadStructInternal(thread_func_t f, void* a) : func(f), arg(a), m_thread(&ThreadStructInternal::Run, this) {} static void Run(ThreadStructInternal* t) { t->unique_id = Lib::Thread::GetThreadIdUnique(); @@ -89,9 +88,9 @@ class Mutex { }; struct MutexStructInternal { - MutexStructInternal() { InitializeCriticalSectionAndSpinCount(&m_cs, 4000); } - ~MutexStructInternal() { DeleteCriticalSection(&m_cs); } - CRITICAL_SECTION m_cs{}; + MutexStructInternal() = default; + ~MutexStructInternal() = default; + std::mutex m_cs{}; }; class ConditionVariable { public: @@ -108,9 +107,9 @@ class ConditionVariable { }; struct ConditionVariableStructInternal { - ConditionVariableStructInternal() { InitializeConditionVariable(&m_cv); } + ConditionVariableStructInternal() = default; ~ConditionVariableStructInternal() = default; - CONDITION_VARIABLE m_cv{}; + std::condition_variable m_cv{}; }; class LockMutexGuard {