This commit is contained in:
offtkp 2023-09-27 23:22:18 +03:00
parent 1395fd4939
commit ad686972ff
3 changed files with 20 additions and 16 deletions

View File

@ -8,6 +8,7 @@
#include "Kernel/Objects/physical_memory.h" #include "Kernel/Objects/physical_memory.h"
#include "Kernel/cpu_management.h" #include "Kernel/cpu_management.h"
#include "Kernel/event_queues.h" #include "Kernel/event_queues.h"
#include <windows.h>
namespace HLE::Libs::LibKernel { namespace HLE::Libs::LibKernel {

View File

@ -1,6 +1,7 @@
#include "Threads.h" #include "Threads.h"
#include <sstream> #include <sstream>
#include <chrono>
static std::thread::id g_main_thread; static std::thread::id g_main_thread;
static int g_main_thread_int; static int g_main_thread_int;
@ -55,25 +56,28 @@ Lib::Mutex::Mutex() { m_mutex = new MutexStructInternal(); }
Lib::Mutex::~Mutex() { delete m_mutex; } 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() { m_cond_var = new ConditionVariableStructInternal(); }
Lib::ConditionVariable::~ConditionVariable() { delete m_cond_var; } 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<std::mutex> lock(mutex->m_mutex->m_cs);
m_cond_var->m_cv.wait(lock);
}
bool Lib::ConditionVariable::WaitCondVarFor(Mutex* mutex, u32 micros) { bool Lib::ConditionVariable::WaitCondVarFor(Mutex* mutex, u32 micros) {
bool ok = false; bool ok = false;
ok = !(SleepConditionVariableCS(&m_cond_var->m_cv, &mutex->m_mutex->m_cs, (micros < 1000 ? 1 : micros / 1000)) == 0 && std::unique_lock<std::mutex> lock(mutex->m_mutex->m_cs);
GetLastError() == ERROR_TIMEOUT); ok = m_cond_var->m_cv.wait_for(lock, std::chrono::microseconds(micros)) == std::cv_status::no_timeout;
return ok; 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(); }

View File

@ -1,11 +1,10 @@
#pragma once #pragma once
#include "windows.h"
#include <synchapi.h>
#include <atomic> #include <atomic>
#include <condition_variable> #include <condition_variable>
#include <string> #include <string>
#include <thread> #include <thread>
#include <functional>
#include "../types.h" #include "../types.h"
@ -52,7 +51,7 @@ class Thread {
}; };
struct ThreadStructInternal { 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) { static void Run(ThreadStructInternal* t) {
t->unique_id = Lib::Thread::GetThreadIdUnique(); t->unique_id = Lib::Thread::GetThreadIdUnique();
@ -89,9 +88,9 @@ class Mutex {
}; };
struct MutexStructInternal { struct MutexStructInternal {
MutexStructInternal() { InitializeCriticalSectionAndSpinCount(&m_cs, 4000); } MutexStructInternal() = default;
~MutexStructInternal() { DeleteCriticalSection(&m_cs); } ~MutexStructInternal() = default;
CRITICAL_SECTION m_cs{}; std::mutex m_cs{};
}; };
class ConditionVariable { class ConditionVariable {
public: public:
@ -108,9 +107,9 @@ class ConditionVariable {
}; };
struct ConditionVariableStructInternal { struct ConditionVariableStructInternal {
ConditionVariableStructInternal() { InitializeConditionVariable(&m_cv); } ConditionVariableStructInternal() = default;
~ConditionVariableStructInternal() = default; ~ConditionVariableStructInternal() = default;
CONDITION_VARIABLE m_cv{}; std::condition_variable m_cv{};
}; };
class LockMutexGuard { class LockMutexGuard {