feat: sync with Whoa implementation

This commit is contained in:
VDm 2026-04-26 17:10:11 +04:00
parent 12ab8f7721
commit 6928bf3f0c
46 changed files with 2980 additions and 441 deletions

View file

@ -6,8 +6,19 @@ CCritSect::CCritSect() {
#endif
#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX)
#if defined(WHOA_STORM_C_CRIT_SECT_RECURSIVE)
// Use of SRgnDuplicate on systems with pthreads needs recursive locking (inside s_rgntable) to prevent deadlocks.
// This behavior doesn't appear to have carried forward to World of Warcraft, probably because SCritSect was
// preferred.
pthread_mutexattr_t mutex_attr;
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&this->m_critsect, &mutex_attr);
#else
pthread_mutex_init(&this->m_critsect, nullptr);
#endif
#endif
}
CCritSect::~CCritSect() {

View file

@ -1,5 +1,27 @@
#include "storm/thread/CSRWLock.hpp"
CSRWLock::CSRWLock() {
#if defined(WHOA_SYSTEM_WIN)
// TODO
SRWLock::SURWLockInitialize(&this->m_opaqueData);
#endif
#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX)
pthread_rwlock_init(&this->m_lock, nullptr);
#endif
}
CSRWLock::~CSRWLock() {
#if defined(WHOA_SYSTEM_WIN)
SRWLock::SURWLockDelete(&this->m_opaqueData);
// TODO
#endif
#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX)
pthread_rwlock_destroy(&this->m_lock);
#endif
}
void CSRWLock::Enter(int32_t forwriting) {
#if defined(WHOA_SYSTEM_WIN)
SRWLock::SURWLockEnter(&this->m_opaqueData, forwriting);

View file

@ -23,6 +23,8 @@ class CSRWLock {
#endif
// Member functions
CSRWLock();
~CSRWLock();
void Enter(int32_t forwriting);
void Leave(int32_t fromwriting);
};

View file

@ -8,7 +8,7 @@
SSyncObject::SSyncObject() {
#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX)
pthread_mutex_init(&this->m_mutex, 0);
pthread_mutex_init(&this->m_mutex, nullptr);
#endif
}

View file

@ -20,7 +20,7 @@ void* S_Thread::s_SLaunchThread(void* threadParam) {
pthread_cond_signal(&params->syncObject->m_cond);
}
SMemFree(threadParam);
STORM_FREE(threadParam);
return nullptr;
}

View file

@ -40,8 +40,7 @@ void* SCreateThread(uint32_t (*threadProc)(void*), void* threadParam, void* a3,
uint32_t threadId = S_Thread::s_threadID++;
void* m = SMemAlloc(sizeof(SThreadParmBlock), __FILE__, __LINE__, 0x8);
auto params = new (m) SThreadParmBlock();
auto params = STORM_NEW_ZERO(SThreadParmBlock);
params->threadProc = threadProc;
params->threadParam = threadParam;
params->threadID = threadId;

View file

@ -37,7 +37,7 @@ uint32_t S_Thread::s_SLaunchThread(void* threadParam) {
pthread_cond_signal(&params->syncObject->m_cond);
}
SMemFree(threadParam);
STORM_FREE(threadParam);
return 0;
}

View file

@ -40,8 +40,7 @@ void* SCreateThread(uint32_t (*threadProc)(void*), void* threadParam, void* a3,
uint32_t threadId = S_Thread::s_threadID++;
void* m = SMemAlloc(sizeof(SThreadParmBlock), __FILE__, __LINE__, 0x8);
auto params = new (m) SThreadParmBlock();
auto params = STORM_NEW_ZERO(SThreadParmBlock);
params->threadProc = threadProc;
params->threadParam = threadParam;
params->threadID = threadId;

View file

@ -8,6 +8,14 @@ void SRWLock::SUNNLockLeave(volatile SUNNLOCK* sunnlock) {
// TODO
}
void SRWLock::SURWLockInitialize(volatile SRWLock::SURWLOCK* surwlock) {
// TODO
}
void SRWLock::SURWLockDelete(volatile SRWLock::SURWLOCK* surwlock) {
// TODO
}
void SRWLock::SURWLockEnter(volatile SURWLOCK* surwlock, int32_t forwriting) {
// TODO
}

View file

@ -19,6 +19,8 @@ class SRWLock {
// Static functions
static void SUNNLockEnter(volatile SUNNLOCK* sunnlock);
static void SUNNLockLeave(volatile SUNNLOCK* sunnlock);
static void SURWLockInitialize(volatile SURWLOCK* surwlock);
static void SURWLockDelete(volatile SURWLOCK* surwlock);
static void SURWLockEnter(volatile SURWLOCK* surwlock, int32_t forwriting);
static void SURWLockLeave(volatile SURWLOCK* surwlock, int32_t fromwriting);
};

View file

@ -6,7 +6,7 @@ DWORD WINAPI S_Thread::s_SLaunchThread(void* threadParam) {
auto proc = params->threadProc;
auto param = params->threadParam;
SMemFree(threadParam);
STORM_FREE(threadParam);
auto val = proc(param);

View file

@ -38,8 +38,7 @@ void* SCreateThread(uint32_t (*threadProc)(void*), void* threadParam, void* a3,
*/
}
void* m = SMemAlloc(sizeof(SThreadParmBlock), __FILE__, __LINE__, 0x8);
auto params = new (m) SThreadParmBlock();
auto params = STORM_NEW(SThreadParmBlock);
params->threadProc = threadProc;
params->threadParam = threadParam;