feat: improve fast crit section

This commit is contained in:
FutureRave 2023-05-04 16:40:33 +01:00
parent 6b9bba991f
commit dadaca86b2
No known key found for this signature in database
GPG Key ID: 22F9079C86CFAB31
5 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,41 @@
#include <std_include.hpp>
#include "game/game.hpp"
#include "fast_critical_section.hpp"
namespace game::engine
{
FastCriticalSectionScopeRead::FastCriticalSectionScopeRead(native::FastCriticalSection* cs)
{
this->cs_ = cs;
if (this->cs_)
{
native::Sys_LockRead(this->cs_);
}
}
FastCriticalSectionScopeRead::~FastCriticalSectionScopeRead()
{
if (this->cs_)
{
native::Sys_UnlockRead(this->cs_);
}
}
FastCriticalSectionScopeWrite::FastCriticalSectionScopeWrite(native::FastCriticalSection* cs)
{
this->cs_ = cs;
if (this->cs_)
{
native::Sys_LockWrite(this->cs_);
}
}
FastCriticalSectionScopeWrite::~FastCriticalSectionScopeWrite()
{
if (this->cs_)
{
native::Sys_UnlockWrite(this->cs_);
}
}
}

View File

@ -0,0 +1,24 @@
#pragma once
namespace game::engine
{
class FastCriticalSectionScopeRead
{
public:
FastCriticalSectionScopeRead(native::FastCriticalSection* cs);
~FastCriticalSectionScopeRead();
private:
native::FastCriticalSection* cs_;
};
class FastCriticalSectionScopeWrite
{
public:
FastCriticalSectionScopeWrite(native::FastCriticalSection* cs);
~FastCriticalSectionScopeWrite();
private:
native::FastCriticalSection* cs_;
};
}

View File

@ -72,6 +72,8 @@ namespace game
Sys_Sleep_t Sys_Sleep;
Sys_FreeFileList_t Sys_FreeFileList;
Sys_MessageBox_t Sys_MessageBox;
Sys_LockWrite_t Sys_LockWrite;
Sys_TempPriorityEnd_t Sys_TempPriorityEnd;
PMem_AllocFromSource_NoDebug_t PMem_AllocFromSource_NoDebug;
@ -569,6 +571,13 @@ namespace game
InterlockedDecrement(&critSect->readCount);
}
void Sys_UnlockWrite(FastCriticalSection* critSect)
{
assert(critSect->writeCount > 0);
InterlockedDecrement(&critSect->writeCount);
Sys_TempPriorityEnd(&critSect->tempPriority);
}
[[noreturn]] void Sys_OutOfMemErrorInternal(const char* filename, int line)
{
Sys_EnterCriticalSection(CRITSECT_FATAL_ERROR);
@ -801,6 +810,8 @@ namespace game
native::Sys_Sleep = native::Sys_Sleep_t(SELECT_VALUE(0x438600, 0x55F460));
native::Sys_FreeFileList = native::Sys_FreeFileList_t(SELECT_VALUE(0x486380, 0x5C4F90));
native::Sys_MessageBox = native::Sys_MessageBox_t(SELECT_VALUE(0x4664D0, 0x5CD180));
native::Sys_LockWrite = native::Sys_LockWrite_t(SELECT_VALUE(0x4C9E70, 0x5502D0));
native::Sys_TempPriorityEnd = native::Sys_TempPriorityEnd_t(SELECT_VALUE(0x4DCF00, 0x4C8CF0));
native::PMem_AllocFromSource_NoDebug = native::PMem_AllocFromSource_NoDebug_t(SELECT_VALUE(0x449E50, 0x5C15C0));

View File

@ -164,6 +164,12 @@ namespace game
typedef int (*Sys_MessageBox_t)(const char* lpText, const char* lpCaption, unsigned int uType, int defaultValue);
extern Sys_MessageBox_t Sys_MessageBox;
typedef void (*Sys_LockWrite_t)(FastCriticalSection* critSect);
extern Sys_LockWrite_t Sys_LockWrite;
typedef void (*Sys_TempPriorityEnd_t)(TempPriority*);
extern Sys_TempPriorityEnd_t Sys_TempPriorityEnd;
typedef void* (*PMem_AllocFromSource_NoDebug_t)(unsigned int size, unsigned int alignment, unsigned int type, int source);
extern PMem_AllocFromSource_NoDebug_t PMem_AllocFromSource_NoDebug;
@ -427,6 +433,7 @@ namespace game
bool Sys_IsServerThread();
void Sys_LockRead(FastCriticalSection* critSect);
void Sys_UnlockRead(FastCriticalSection* critSect);
void Sys_UnlockWrite(FastCriticalSection* critSect);
[[noreturn]] void Sys_OutOfMemErrorInternal(const char* filename, int line);
bool FS_Initialized();

View File

@ -39,6 +39,7 @@
#endif
#include <atomic>
#include <cassert>
#include <chrono>
#include <filesystem>
#include <format>