AuroraRuntime/Source/Memory/AuHeapAlignmentInterface.cpp
Jamie Reece Wilson 8be1afe570 [+] AuMemory::Heap adapters for third party heap allocators
[+] AuMemory::HeapAdapterInterface to describe aforementioned heap allocators of a very limited API
[+] AuMemory::HeapAdapter[Unique,Shared,]
[+] HeapWin32Adapter to convert HANDLE hHeaps of win32s CreateHeap (RtlCreateHeap?) into AuMemory::Heaps
2024-07-19 09:06:56 +01:00

92 lines
2.7 KiB
C++

/***
Copyright (C) 2024 Jamie Reece Wilson (a/k/a "Reece"). All rights reserved.
File: AuHeapAlignmentInterface.cpp
File: Heap.hpp
Date: 2024-7-17
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "AuHeap.hpp"
#include "AuHeapAlignmentInterface.hpp"
namespace Aurora::Memory
{
struct OldHeap
{
HeapAdapterInterface interface;
};
static void *AlignedHeapAllocate(HeapAdapterHandle *pHandle,
AuUInt uLength,
AuUInt uAlignment)
{
auto pInterface = (OldHeap *)pHandle->pReserved[0];
uAlignment = AuNextPow2(uAlignment);
const auto kAlignment = AuMax(uAlignment, sizeof(void *) * 2);
auto pPtr = (AuUInt8 *)pInterface->interface.fAllocate(&pInterface->interface.handle, uLength + (kAlignment * 2), kAlignment);
if (!pPtr)
{
return {};
}
auto pRet = (AuUInt8 *)AuPageRoundUp(AuUInt(pPtr + kAlignment), uAlignment);
auto pSize = pRet - (sizeof(void *) * 2);
auto pDelta = pRet - (sizeof(void *) * 1);
*(AuUInt *)pSize = uLength;
*(AuUInt *)pDelta = AuUInt(pPtr);
return pRet;
}
static void AlignedHeapFree(HeapAdapterHandle *pHandle,
void *pPointer)
{
auto pInterface = (OldHeap *)pHandle->pReserved[0];
auto pRet = (AuUInt8 *)pPointer;
auto pDelta = pRet - (sizeof(void *) * 1);
pInterface->interface.fFree(&pInterface->interface.handle, *(void **)pDelta);
}
static AuUInt AlignedHeapGetBlockSize(HeapAdapterHandle *pHandle,
void *pPointer)
{
auto pRet = (AuUInt8 *)pPointer;
auto pSize = pRet - (sizeof(void *) * 2);
return *(AuUInt *)pSize;
}
static void AlignedHeapDestroy(HeapAdapterHandle *pHandle)
{
auto pInterface = (OldHeap *)pHandle->pReserved[0];
if (pInterface->interface.fHeapDestroy)
{
pInterface->interface.fHeapDestroy(&pInterface->interface.handle);
}
delete pInterface;
}
bool MakeHeapInterfaceOfStricterAlignment(HeapAdapterInterface *pInterface)
{
auto pNew = _new OldHeap();
if (!pNew)
{
return false;
}
pNew->interface = *pInterface;
pInterface->handle.pReserved[0] = pNew;
pInterface->fHeapDestroy = AlignedHeapDestroy;
pInterface->fGetBlockSize = AlignedHeapGetBlockSize;
pInterface->fFree = AlignedHeapFree;
pInterface->fAllocate = AlignedHeapAllocate;
return true;
}
}