Fix aligned memalloc singleton

Properly fix the aligned memalloc singleton in the SDK; the implementation now uses a callback based approach for calling the allocator and deallocator.
This commit is contained in:
Kawe Mazidjatari 2023-05-15 20:47:17 +02:00
parent 95316ab1c8
commit 8acfad5556
5 changed files with 53 additions and 10 deletions

View File

@ -338,13 +338,13 @@ void Mod_ProcessPakQueue()
Mod_PreloadLevelPaks(s_svLevelName.c_str());
s_bLevelResourceInitialized = true;
}
*(_DWORD*)v15 = g_pakLoadApi->LoadAsync(v17, g_pAlignedMemAlloc, 4, 0);
*(_DWORD*)v15 = g_pakLoadApi->LoadAsync(v17, AlignedMemAlloc(), 4, 0);
if (strcmp(v17, "common_mp.rpak") == 0 || strcmp(v17, "common_sp.rpak") == 0 || strcmp(v17, "common_pve.rpak") == 0)
g_pakLoadApi->LoadAsync("common_sdk.rpak", g_pAlignedMemAlloc, 4, 0);
g_pakLoadApi->LoadAsync("common_sdk.rpak", AlignedMemAlloc(), 4, 0);
#ifndef DEDICATED
if (strcmp(v17, "ui_mp.rpak") == 0)
g_pakLoadApi->LoadAsync("ui_sdk.rpak", g_pAlignedMemAlloc, 4, 0);
g_pakLoadApi->LoadAsync("ui_sdk.rpak", AlignedMemAlloc(), 4, 0);
#endif // !DEDICATED
LABEL_37:
@ -429,7 +429,7 @@ void Mod_PreloadLevelPaks(const char* pszLevelName)
continue;
snprintf(szPathBuffer, sizeof(szPathBuffer), "%s.rpak", pSubKey->GetName());
RPakHandle_t nPakId = g_pakLoadApi->LoadAsync(szPathBuffer, g_pAlignedMemAlloc, 4, 0);
RPakHandle_t nPakId = g_pakLoadApi->LoadAsync(szPathBuffer, AlignedMemAlloc(), 4, 0);
if (nPakId == INVALID_PAK_HANDLE)
Error(eDLL_T::ENGINE, NO_ERROR, "%s: unable to load pak '%s' results '%d'\n", __FUNCTION__, szPathBuffer, nPakId);

View File

@ -1,14 +1,29 @@
#ifndef TSLIST_H
#define TSLIST_H
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
class CAlignedMemAlloc
{
public:
virtual void* Alloc(size_t nSize) = 0;
virtual void Free(void* pMem) = 0;
void* Alloc(size_t nSize, size_t nAlignment = 0);
void Free(void* pMem);
private:
void* m_pAllocCallback;
void* m_pFreeCallback;
};
inline CAlignedMemAlloc* g_pAlignedMemAlloc;
extern CAlignedMemAlloc* g_pAlignedMemAlloc;
//-----------------------------------------------------------------------------
// Singleton aligned memalloc
//-----------------------------------------------------------------------------
inline CAlignedMemAlloc* AlignedMemAlloc()
{
return g_pAlignedMemAlloc;
}
///////////////////////////////////////////////////////////////////////////////
class VTSListBase : public IDetour

View File

@ -39,7 +39,7 @@ inline CMemory p_CPakFile_OpenFileOffset; // Offset to inlined 'CPakFile::LoadPa
class CPakFile
{
public:
static RPakHandle_t LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc = g_pAlignedMemAlloc, int nIdx = NULL, bool bUnk = false);
static RPakHandle_t LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc = AlignedMemAlloc(), int nIdx = NULL, bool bUnk = false);
static void UnloadPak(RPakHandle_t handle);
};

View File

@ -0,0 +1,28 @@
//=============================================================================//
//
// Purpose:
//
//=============================================================================//
#include "tier0/tslist.h"
//-----------------------------------------------------------------------------
// Purpose: alloc aligned memory
// Input : nSize -
// nPad -
// Output : pointer to allocated aligned memory
//-----------------------------------------------------------------------------
void* CAlignedMemAlloc::Alloc(size_t nSize, size_t nAlignment)
{
return ((void* (*)(size_t, size_t))m_pAllocCallback)(nSize, nAlignment);
}
//-----------------------------------------------------------------------------
// Purpose: free aligned memory
// Input : pMem -
//-----------------------------------------------------------------------------
void CAlignedMemAlloc::Free(void* pMem)
{
((void (*)(void*))m_pFreeCallback)(pMem);
}
CAlignedMemAlloc* g_pAlignedMemAlloc;

View File

@ -191,8 +191,8 @@ void CSquirrelVM::CompileModScripts()
if (rson)
{
RSON_Free(rson, g_pAlignedMemAlloc);
//g_pAlignedMemAlloc->Free(rson); // TODO: fix g_pAlignedMemAlloc and free this properly
RSON_Free(rson, AlignedMemAlloc());
AlignedMemAlloc()->Free(rson);
}
}
}