/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: MemoryCrunch.cpp Date: 2022-12-07 Author: Reece ***/ #include #include "Debug.hpp" #include "ErrorStack.hpp" #include #include namespace Aurora::Debug { static thread_local AuSInt tlsMemoryCrunchCounter; static auto const kDefaultReservePool = 3 * 1024 * 1024; // Extern defintions AuUInt8 *gReservePoolStart {}; AuUInt8 *gReservePoolEnd {}; AuSPtr gReserveHeap {}; void InitMemoryCrunch() { gReserveHeap = AuMemory::AllocHeapShared(gRuntimeConfig.debug.uDebugMemoryReserveSize ? gRuntimeConfig.debug.uDebugMemoryReserveSize : kDefaultReservePool); SysAssert(gReserveHeap); auto pHeap = AuStaticCast(gReserveHeap); gReservePoolStart = AuReinterpretCast(pHeap->GetHeapBase()); gReservePoolEnd = AuReinterpretCast(gReservePoolStart) + pHeap->GetHeapLength(); } bool IsPointerReserveRange(void *ptr) { auto pChar = (AuUInt8 *)ptr; return pChar >= gReservePoolStart && pChar < gReservePoolEnd; } AuSPtr GetCrunchInterface() { return gReserveHeap; } bool IsTlsMemoryCrunchActive() { return bool(tlsMemoryCrunchCounter); } AUKN_SYM void AddMemoryCrunch() { tlsMemoryCrunchCounter++; } AUKN_SYM void DecMemoryCrunch() { tlsMemoryCrunchCounter--; SysAssert(tlsMemoryCrunchCounter >= 0, "crunch counter underflow"); } }