aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/memalloc.cpp
diff options
context:
space:
mode:
authorp0358 <p0358@users.noreply.github.com>2021-12-31 22:25:40 +0100
committerGitHub <noreply@github.com>2021-12-31 22:25:40 +0100
commitdcba96bcc4b02639e859b0dcdc863391cb54684f (patch)
tree99d129460365774ae011d83b3765e7d9388c44a7 /NorthstarDedicatedTest/memalloc.cpp
parent4f7c3d02943a38941b79a638c5607b2b7f668956 (diff)
parentd658c0c8374f8491e062fabe031f79185169c414 (diff)
downloadNorthstarLauncher-dcba96bcc4b02639e859b0dcdc863391cb54684f.tar.gz
NorthstarLauncher-dcba96bcc4b02639e859b0dcdc863391cb54684f.zip
Merge pull request #1 from geniiii/p0358-refactor-fixes
Fixes, removal of fallback linear allocator
Diffstat (limited to 'NorthstarDedicatedTest/memalloc.cpp')
-rw-r--r--NorthstarDedicatedTest/memalloc.cpp76
1 files changed, 18 insertions, 58 deletions
diff --git a/NorthstarDedicatedTest/memalloc.cpp b/NorthstarDedicatedTest/memalloc.cpp
index c1fb70e7..86215e3f 100644
--- a/NorthstarDedicatedTest/memalloc.cpp
+++ b/NorthstarDedicatedTest/memalloc.cpp
@@ -2,43 +2,16 @@
#include "memalloc.h"
#include "gameutils.h"
-// so for anyone reading this code, you may be curious why the fuck i'm overriding new to alloc into a static 100k buffer
-// pretty much, the issue here is that we need to use the game's memory allocator (g_pMemAllocSingleton) or risk heap corruptions, but this allocator is defined in tier0
-// as such, it doesn't exist when we inject
-// initially i wanted to just call malloc and free until g_pMemAllocSingleton was initialised, but the issue then becomes that we might try to
-// call g_pMemAllocSingleton->Free on memory that was allocated with malloc, which will cause game to crash
-// so, the best idea i had for this was to just alloc 100k of memory, have all pre-tier0 allocations use that
-// (from what i can tell we hit about 12k before tier0 is loaded atm in debug builds, so it's more than enough)
-// then just use the game's allocator after that
-// yes, this means we leak 100k of memory, idk how else to do this without breaking stuff
-
-const int STATIC_ALLOC_SIZE = 100000; // alot more than we need, could reduce to 50k or even 25k later potentially
-
-size_t g_iStaticAllocated = 0;
-void* g_pLastAllocated = nullptr;
-char pStaticAllocBuf[STATIC_ALLOC_SIZE];
-
// TODO: rename to malloc and free after removing statically compiled .libs
extern "C" void* _malloc_base(size_t n)
{
// allocate into static buffer if g_pMemAllocSingleton isn't initialised
- if (g_pMemAllocSingleton)
- {
- //printf("Northstar malloc (g_pMemAllocSingleton): %llu\n", n);
- return g_pMemAllocSingleton->m_vtable->Alloc(g_pMemAllocSingleton, n);
- }
- else
+ if (!g_pMemAllocSingleton)
{
- if (g_iStaticAllocated + n > STATIC_ALLOC_SIZE)
- {
- throw "Ran out of prealloc space"; // we could log, but spdlog probably does use allocations as well...
- }
- //printf("Northstar malloc (prealloc): %llu\n", n);
- void* ret = pStaticAllocBuf + g_iStaticAllocated;
- g_iStaticAllocated += n;
- return ret;
+ InitialiseTier0GameUtilFunctions(GetModuleHandleA("tier0.dll"));
}
+ return g_pMemAllocSingleton->m_vtable->Alloc(g_pMemAllocSingleton, n);
}
/*extern "C" void* malloc(size_t n)
@@ -48,44 +21,31 @@ extern "C" void* _malloc_base(size_t n)
extern "C" void _free_base(void* p)
{
- // if it was allocated into the static buffer, just do nothing, safest way to deal with it
- if (p >= pStaticAllocBuf && p <= pStaticAllocBuf + STATIC_ALLOC_SIZE)
+ if (!g_pMemAllocSingleton)
{
- //printf("Northstar free (prealloc): %p\n", p);
- return;
+ InitialiseTier0GameUtilFunctions(GetModuleHandleA("tier0.dll"));
}
-
- //printf("Northstar free (g_pMemAllocSingleton): %p\n", p);
g_pMemAllocSingleton->m_vtable->Free(g_pMemAllocSingleton, p);
}
-extern "C" void* _realloc_base(void* old_ptr, size_t size) {
- // it was allocated into the static buffer
- if (old_ptr >= pStaticAllocBuf && old_ptr <= pStaticAllocBuf + STATIC_ALLOC_SIZE)
+
+extern "C" void* _realloc_base(void* oldPtr, size_t size) {
+ if (!g_pMemAllocSingleton)
{
- if (g_pLastAllocated == old_ptr)
- {
- // nothing was allocated after this
- size_t old_size = g_iStaticAllocated - ((size_t)g_pLastAllocated - (size_t)pStaticAllocBuf);
- size_t diff = size - old_size;
- if (diff > 0)
- g_iStaticAllocated += diff;
- return old_ptr;
- }
- else
- {
- return _malloc_base(size);
- }
+ InitialiseTier0GameUtilFunctions(GetModuleHandleA("tier0.dll"));
}
-
- if (g_pMemAllocSingleton)
- return g_pMemAllocSingleton->m_vtable->Realloc(g_pMemAllocSingleton, old_ptr, size);
- return nullptr;
+ return g_pMemAllocSingleton->m_vtable->Realloc(g_pMemAllocSingleton, oldPtr, size);
}
extern "C" void* _calloc_base(size_t n, size_t size)
{
- return _malloc_base(n * size);
+ size_t bytes = n * size;
+ void* memory = _malloc_base(bytes);
+ if (memory)
+ {
+ memset(memory, 0, bytes);
+ }
+ return memory;
}
extern "C" char* _strdup_base(const char* src)
@@ -96,7 +56,7 @@ extern "C" char* _strdup_base(const char* src)
while (src[len])
len++;
- str = reinterpret_cast<char*>(_malloc_base(len + 1));
+ str = (char*)(_malloc_base(len + 1));
p = str;
while (*src)
*p++ = *src++;