1
0
Fork 0
x64dbg/x64_dbg_dbg/threading.cpp

72 lines
1.3 KiB
C++

#include "threading.h"
static volatile bool waitarray[16];
void waitclear()
{
memset((void*)waitarray, 0, sizeof(waitarray));
}
void wait(WAIT_ID id)
{
while(waitarray[id]) //1=locked, 0=unlocked
Sleep(1);
}
void lock(WAIT_ID id)
{
waitarray[id] = true;
}
void unlock(WAIT_ID id)
{
waitarray[id] = false;
}
bool waitislocked(WAIT_ID id)
{
return waitarray[id];
}
static CRITICAL_SECTION locks[LockLast] = {};
static bool bInitDone = false;
static void CriticalSectionInitializeLocks()
{
if(bInitDone)
return;
for(int i = 0; i < LockLast; i++)
InitializeCriticalSection(&locks[i]);
bInitDone = true;
}
void CriticalSectionDeleteLocks()
{
if(!bInitDone)
return;
for(int i = 0; i < LockLast; i++)
DeleteCriticalSection(&locks[i]);
bInitDone = false;
}
CriticalSectionLocker::CriticalSectionLocker(CriticalSectionLock lock)
{
CriticalSectionInitializeLocks(); //initialize critical sections
gLock = lock;
EnterCriticalSection(&locks[gLock]);
}
CriticalSectionLocker::~CriticalSectionLocker()
{
LeaveCriticalSection(&locks[gLock]);
}
void CriticalSectionLocker::unlock()
{
LeaveCriticalSection(&locks[gLock]);
}
void CriticalSectionLocker::relock()
{
EnterCriticalSection(&locks[gLock]);
}