[System]: Correct one function (#660)
This commit is contained in:
parent
64c64cf9df
commit
a4a622be52
@ -246,7 +246,7 @@ namespace Components
|
|||||||
if (ent->client->sess.sessionState != Game::SESS_STATE_PLAYING || !CheatsOk(ent))
|
if (ent->client->sess.sessionState != Game::SESS_STATE_PLAYING || !CheatsOk(ent))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto** bgs = Game::Sys::GetTls<Game::bgs_t*>(Game::Sys::ThreadOffset::LEVEL_BGS);
|
auto** bgs = Game::Sys::GetTls<Game::bgs_t*>(Game::Sys::TLS_OFFSET::LEVEL_BGS);
|
||||||
|
|
||||||
assert(*bgs == nullptr);
|
assert(*bgs == nullptr);
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ namespace Game
|
|||||||
static jmp_buf g_com_error{}; \
|
static jmp_buf g_com_error{}; \
|
||||||
static Game::TraceThreadInfo g_trace_thread_info{}; \
|
static Game::TraceThreadInfo g_trace_thread_info{}; \
|
||||||
static void* g_thread_values[Game::THREAD_VALUE_COUNT]{}; \
|
static void* g_thread_values[Game::THREAD_VALUE_COUNT]{}; \
|
||||||
*(Game::Sys::GetTls<void*>(Game::Sys::THREAD_VALUES)) = g_thread_values; \
|
*(Game::Sys::GetTls<void*>(Game::Sys::TLS_OFFSET::THREAD_VALUES)) = g_thread_values; \
|
||||||
Game::Sys_SetValue(Game::THREAD_VALUE_PROF_STACK, &profile_stack); \
|
Game::Sys_SetValue(Game::THREAD_VALUE_PROF_STACK, &profile_stack); \
|
||||||
Game::Sys_SetValue(Game::THREAD_VALUE_VA, &va_info); \
|
Game::Sys_SetValue(Game::THREAD_VALUE_VA, &va_info); \
|
||||||
Game::Sys_SetValue(Game::THREAD_VALUE_COM_ERROR, &g_com_error); \
|
Game::Sys_SetValue(Game::THREAD_VALUE_COM_ERROR, &g_com_error); \
|
||||||
|
@ -12,6 +12,7 @@ namespace Game
|
|||||||
Sys_ListFiles_t Sys_ListFiles = Sys_ListFiles_t(0x45A660);
|
Sys_ListFiles_t Sys_ListFiles = Sys_ListFiles_t(0x45A660);
|
||||||
Sys_Milliseconds_t Sys_Milliseconds = Sys_Milliseconds_t(0x42A660);
|
Sys_Milliseconds_t Sys_Milliseconds = Sys_Milliseconds_t(0x42A660);
|
||||||
Sys_Error_t Sys_Error = Sys_Error_t(0x43D570);
|
Sys_Error_t Sys_Error = Sys_Error_t(0x43D570);
|
||||||
|
Sys_Sleep_t Sys_Sleep = Sys_Sleep_t(0x4169C0);
|
||||||
Sys_LockWrite_t Sys_LockWrite = Sys_LockWrite_t(0x435880);
|
Sys_LockWrite_t Sys_LockWrite = Sys_LockWrite_t(0x435880);
|
||||||
Sys_TempPriorityAtLeastNormalBegin_t Sys_TempPriorityAtLeastNormalBegin = Sys_TempPriorityAtLeastNormalBegin_t(0x478680);
|
Sys_TempPriorityAtLeastNormalBegin_t Sys_TempPriorityAtLeastNormalBegin = Sys_TempPriorityAtLeastNormalBegin_t(0x478680);
|
||||||
Sys_TempPriorityEnd_t Sys_TempPriorityEnd = Sys_TempPriorityEnd_t(0x4DCF00);
|
Sys_TempPriorityEnd_t Sys_TempPriorityEnd = Sys_TempPriorityEnd_t(0x4DCF00);
|
||||||
@ -30,7 +31,7 @@ namespace Game
|
|||||||
void Sys_LockRead(FastCriticalSection* critSect)
|
void Sys_LockRead(FastCriticalSection* critSect)
|
||||||
{
|
{
|
||||||
InterlockedIncrement(&critSect->readCount);
|
InterlockedIncrement(&critSect->readCount);
|
||||||
while (critSect->writeCount) std::this_thread::sleep_for(1ms);
|
while (critSect->writeCount) Sys_Sleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sys_UnlockRead(FastCriticalSection* critSect)
|
void Sys_UnlockRead(FastCriticalSection* critSect)
|
||||||
@ -39,10 +40,16 @@ namespace Game
|
|||||||
InterlockedDecrement(&critSect->readCount);
|
InterlockedDecrement(&critSect->readCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Sys_UnlockWrite(FastCriticalSection* critSect)
|
||||||
|
{
|
||||||
|
assert(critSect->writeCount > 0);
|
||||||
|
InterlockedDecrement(&critSect->writeCount);
|
||||||
|
Sys_TempPriorityEnd(&critSect->tempPriority);
|
||||||
|
}
|
||||||
|
|
||||||
bool Sys_TryEnterCriticalSection(CriticalSection critSect)
|
bool Sys_TryEnterCriticalSection(CriticalSection critSect)
|
||||||
{
|
{
|
||||||
assert(static_cast<unsigned int>(critSect) <
|
AssertIn(critSect, CRITSECT_COUNT);
|
||||||
static_cast<unsigned int>(CRITSECT_COUNT));
|
|
||||||
|
|
||||||
return TryEnterCriticalSection(&s_criticalSection[critSect]) != FALSE;
|
return TryEnterCriticalSection(&s_criticalSection[critSect]) != FALSE;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,9 @@ namespace Game
|
|||||||
typedef int(*Sys_Milliseconds_t)();
|
typedef int(*Sys_Milliseconds_t)();
|
||||||
extern Sys_Milliseconds_t Sys_Milliseconds;
|
extern Sys_Milliseconds_t Sys_Milliseconds;
|
||||||
|
|
||||||
|
typedef void(*Sys_Sleep_t)(int msec);
|
||||||
|
extern Sys_Sleep_t Sys_Sleep;
|
||||||
|
|
||||||
typedef void(*Sys_LockWrite_t)(FastCriticalSection* critSect);
|
typedef void(*Sys_LockWrite_t)(FastCriticalSection* critSect);
|
||||||
extern Sys_LockWrite_t Sys_LockWrite;
|
extern Sys_LockWrite_t Sys_LockWrite;
|
||||||
|
|
||||||
@ -68,13 +71,14 @@ namespace Game
|
|||||||
|
|
||||||
extern void Sys_LockRead(FastCriticalSection* critSect);
|
extern void Sys_LockRead(FastCriticalSection* critSect);
|
||||||
extern void Sys_UnlockRead(FastCriticalSection* critSect);
|
extern void Sys_UnlockRead(FastCriticalSection* critSect);
|
||||||
|
extern void Sys_UnlockWrite(FastCriticalSection* critSect);
|
||||||
|
|
||||||
extern bool Sys_TryEnterCriticalSection(CriticalSection critSect);
|
extern bool Sys_TryEnterCriticalSection(CriticalSection critSect);
|
||||||
|
|
||||||
class Sys
|
class Sys
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum ThreadOffset : unsigned int
|
enum class TLS_OFFSET : unsigned int
|
||||||
{
|
{
|
||||||
LEVEL_BGS = 0xC,
|
LEVEL_BGS = 0xC,
|
||||||
THREAD_VALUES = 0x14,
|
THREAD_VALUES = 0x14,
|
||||||
@ -85,10 +89,10 @@ namespace Game
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static T* GetTls(ThreadOffset offset)
|
static T* GetTls(TLS_OFFSET offset)
|
||||||
{
|
{
|
||||||
const auto* tls = reinterpret_cast<std::uintptr_t*>(__readfsdword(0x2C));
|
const auto* tls = reinterpret_cast<std::uintptr_t*>(__readfsdword(0x2C));
|
||||||
return reinterpret_cast<T*>(tls[*g_dwTlsIndex] + offset);
|
return reinterpret_cast<T*>(tls[*g_dwTlsIndex] + static_cast<std::underlying_type_t<TLS_OFFSET>>(offset));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user