prime/src/Kyoto/Alloc/CMediumAllocPool.cpp
Phillip Stephens 543a0f1fe8 Start matching CMediumAllocPool
Former-commit-id: 2c3e4985b1fc9dbe7c80ba4773b2cf2621c0ef36
2023-10-02 22:36:22 -07:00

123 lines
3.2 KiB
C++

#include "Kyoto/Alloc/CMediumAllocPool.hpp"
CMediumAllocPool* CMediumAllocPool::gMediumAllocPtr = nullptr;
CMediumAllocPool::CMediumAllocPool() {
x18_lastNodePrev = x0_list.begin().get_node();
gMediumAllocPtr = this;
}
void CMediumAllocPool::ClearPuddles() {
x18_lastNodePrev = x0_list.end().get_node();
x0_list.clear();
gMediumAllocPtr = nullptr;
}
bool CMediumAllocPool::HasPuddles() const { return x0_list.size() != 0; }
void* CMediumAllocPool::Alloc(uint len) {
SMediumAllocPuddle* puddle = x18_lastNodePrev->get_value();
void* ret;
uint blockCount = 1;
if (len >= 32) {
blockCount = (len + 31) >> 5;
}
ret = puddle->FindFree(blockCount);
if (ret == nullptr) {
for (rstl::list< SMediumAllocPuddle >::iterator it = x0_list.begin(); it != x0_list.end();
++it) {
if (it.get_node() == x18_lastNodePrev) {
continue;
}
ret = it->FindFree(blockCount);
if (ret != nullptr) {
x18_lastNodePrev = it.get_node();
break;
}
}
}
return ret;
}
int CMediumAllocPool::Free(const void* ptr) {}
uint CMediumAllocPool::GetNumAllocs() {
uint ret = 0;
for (rstl::list< SMediumAllocPuddle >::iterator it = x0_list.begin(); it != x0_list.end(); ++it) {
ret += it->GetNumAllocs();
}
return ret;
}
uint CMediumAllocPool::GetTotalEntries() {
uint ret = 0;
for (rstl::list< SMediumAllocPuddle >::iterator it = x0_list.begin(); it != x0_list.end(); ++it) {
ret += it->GetNumEntries();
}
return ret;
}
uint CMediumAllocPool::GetNumBlocksAvailable() {
uint ret = 0;
for (rstl::list< SMediumAllocPuddle >::iterator it = x0_list.begin(); it != x0_list.end(); ++it) {
ret += it->GetNumBlocks();
}
return ret;
}
/* this is such a hack... */
#pragma inline_max_size(250)
void CMediumAllocPool::AddPuddle(uint len, void* data, const bool unk) {
x0_list.push_back(SMediumAllocPuddle(len, data, unk));
x18_lastNodePrev = x0_list.end().get_node();
x18_lastNodePrev = x18_lastNodePrev->get_prev();
}
SMediumAllocPuddle::SMediumAllocPuddle(const uint numBlocks, void* data, const bool unk)
: x0_mainData(data)
, x8_bookKeeping((uchar*)data + numBlocks * 32)
, xc_cachedBookKeepingAddr(nullptr)
, x10_(-1)
, x14_numBlocks(numBlocks)
, x18_numAllocs(0)
, x1c_numEntries(numBlocks)
, x20_unk2(unk) {
SMediumAllocPuddle::InitBookKeeping(x8_bookKeeping, numBlocks & 0xFFFF);
}
SMediumAllocPuddle::~SMediumAllocPuddle() {}
void* SMediumAllocPuddle::FindFree(uint blockCount) {
void* bookKeepingptr;
uchar* entryPtr;
void* ret;
entryPtr = (uchar*)FindFreeEntry(blockCount);
if (entryPtr == NULL) {
return NULL;
}
bookKeepingptr = x8_bookKeeping;
ret = x0_mainData.get();
entryPtr[0] = (uchar)blockCount;
ret = (void*)((uchar*)ret + ((uchar*)entryPtr - (uchar*)bookKeepingptr) * 0x20);
entryPtr[blockCount - 1] = blockCount;
x14_numBlocks -= blockCount;
x18_numAllocs++;
return ret;
}
void* SMediumAllocPuddle::FindFreeEntry(uint numBlocks) { return nullptr; }
bool SMediumAllocPuddle::Free(const void* ptr) {}
uint SMediumAllocPuddle::GetBlockOffset(const void* ptrA, const void* ptrB) { return 0; }
void SMediumAllocPuddle::InitBookKeeping(void* bookKeepingPtr, uint blockCount) {}