3namespace Kinoko::Abstract::Memory {
5MEMiFrmHeapHead::MEMiFrmHeapHead(
void *end, u16 opt)
7 m_headAllocator = getHeapStart();
8 m_tailAllocator = getHeapEnd();
12MEMiFrmHeapHead::~MEMiFrmHeapHead() =
default;
15MEMiFrmHeapHead *MEMiFrmHeapHead::create(
void *startAddress,
size_t size, u16 flag) {
16 void *endAddress = AddOffset(startAddress, size);
18 startAddress = RoundUp(startAddress, 4);
19 endAddress = RoundDown(endAddress, 4);
21 uintptr_t startAddrNum = GetAddrNum(startAddress);
22 uintptr_t endAddrNum = GetAddrNum(endAddress);
24 if (startAddrNum > endAddrNum) {
28 if (endAddrNum - startAddrNum <
sizeof(MEMiFrmHeapHead) + 4) {
32 return new (startAddress) MEMiFrmHeapHead(endAddress, flag);
35void MEMiFrmHeapHead::destroy() {
36 this->~MEMiFrmHeapHead();
40void *MEMiFrmHeapHead::alloc(
size_t size, s32 align) {
44 size = RoundUp(size, 4);
46 void *block =
nullptr;
48 block = allocFromHead(size, align);
50 block = allocFromTail(size, -align);
57u32 MEMiFrmHeapHead::getAllocatableSize(s32 align)
const {
59 align = std::abs(align);
60 void *block = RoundUp(m_headAllocator, align);
61 return block > m_tailAllocator ? 0 : GetAddrNum(SubOffset(m_tailAllocator, GetAddrNum(block)));
64void *MEMiFrmHeapHead::calcUsedEnd() {
65 return m_tailAllocator == getHeapEnd() ? m_headAllocator : getHeapEnd();
68void *MEMiFrmHeapHead::allocFromHead(
size_t size, s32 alignment) {
69 void *start = RoundUp(m_headAllocator, alignment);
70 void *end = AddOffset(start, size);
72 if (end > m_tailAllocator) {
76 fillAllocMemory(start, size);
77 m_headAllocator = end;
81void *MEMiFrmHeapHead::allocFromTail(
size_t size, s32 alignment) {
82 void *start = RoundDown(SubOffset(m_tailAllocator, size), alignment);
84 if (start < m_headAllocator) {
88 fillAllocMemory(start, size);
89 m_tailAllocator = start;
A low-level representation of a memory heap for managing dynamic memory allocation....