mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-08-10 04:59:08 +00:00
123 lines
3.2 KiB
C++
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) {}
|