mirror of
https://github.com/thunderbrewhq/squall.git
synced 2026-05-06 15:23:51 +00:00
feat: sync with Whoa implementation
This commit is contained in:
parent
12ab8f7721
commit
6928bf3f0c
46 changed files with 2980 additions and 441 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ class CSRWLock {
|
|||
#endif
|
||||
|
||||
// Member functions
|
||||
CSRWLock();
|
||||
~CSRWLock();
|
||||
void Enter(int32_t forwriting);
|
||||
void Leave(int32_t fromwriting);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ void* S_Thread::s_SLaunchThread(void* threadParam) {
|
|||
pthread_cond_signal(¶ms->syncObject->m_cond);
|
||||
}
|
||||
|
||||
SMemFree(threadParam);
|
||||
STORM_FREE(threadParam);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ uint32_t S_Thread::s_SLaunchThread(void* threadParam) {
|
|||
pthread_cond_signal(¶ms->syncObject->m_cond);
|
||||
}
|
||||
|
||||
SMemFree(threadParam);
|
||||
STORM_FREE(threadParam);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue