mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 06:53:43 +00:00
122 lines
2.4 KiB
C++
122 lines
2.4 KiB
C++
#include "MemoryManager.h"
|
|
#include "MMHandleBlock.h"
|
|
#include "ResourceCompiledRef.h"
|
|
#include "ResourceManager.h"
|
|
#include "IGpAllocator.h"
|
|
#include "PLDrivers.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <new>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
namespace PortabilityLayer
|
|
{
|
|
class MemoryManagerImpl final : public MemoryManager
|
|
{
|
|
public:
|
|
void Init() override;
|
|
void Shutdown() override;
|
|
|
|
void *Alloc(size_t size) override;
|
|
void *Realloc(void *buf, size_t newSize) override;
|
|
void Release(void *buf) override;
|
|
|
|
MMHandleBlock *AllocHandle(size_t size) override;
|
|
bool ResizeHandle(MMHandleBlock *hdl, size_t newSize) override;
|
|
void ReleaseHandle(MMHandleBlock *hdl) override;
|
|
|
|
static MemoryManagerImpl *GetInstance();
|
|
|
|
private:
|
|
static MemoryManagerImpl ms_instance;
|
|
};
|
|
|
|
void MemoryManagerImpl::Init()
|
|
{
|
|
}
|
|
|
|
void MemoryManagerImpl::Shutdown()
|
|
{
|
|
}
|
|
|
|
void *MemoryManagerImpl::Realloc(void *buf, size_t newSize)
|
|
{
|
|
return PLDrivers::GetAlloc()->Realloc(buf, newSize);
|
|
}
|
|
|
|
void *MemoryManagerImpl::Alloc(size_t size)
|
|
{
|
|
return PLDrivers::GetAlloc()->Realloc(nullptr, size);
|
|
}
|
|
|
|
void MemoryManagerImpl::Release(void *buf)
|
|
{
|
|
PLDrivers::GetAlloc()->Realloc(buf, 0);
|
|
}
|
|
|
|
MMHandleBlock *MemoryManagerImpl::AllocHandle(size_t size)
|
|
{
|
|
void *contents = Alloc(size);
|
|
MMHandleBlock *handleBlock = static_cast<MMHandleBlock*>(Alloc(sizeof(MMHandleBlock)));
|
|
|
|
return new (handleBlock) MMHandleBlock(contents, size);
|
|
}
|
|
|
|
bool MemoryManagerImpl::ResizeHandle(MMHandleBlock *hdl, size_t newSize)
|
|
{
|
|
if (hdl->m_contents == nullptr)
|
|
{
|
|
if (newSize != 0)
|
|
{
|
|
void *newBuf = Alloc(newSize);
|
|
if (!newBuf)
|
|
return false;
|
|
|
|
hdl->m_contents = newBuf;
|
|
hdl->m_size = newSize;
|
|
}
|
|
}
|
|
|
|
if (newSize != hdl->m_size)
|
|
{
|
|
void *newBuf = Realloc(hdl->m_contents, newSize);
|
|
if (!newBuf)
|
|
return false;
|
|
|
|
hdl->m_contents = newBuf;
|
|
hdl->m_size = newSize;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void MemoryManagerImpl::ReleaseHandle(MMHandleBlock *hdl)
|
|
{
|
|
if (!hdl)
|
|
return;
|
|
|
|
if (hdl->m_rmSelfRef)
|
|
PortabilityLayer::ResourceManager::GetInstance()->DissociateHandle(hdl);
|
|
|
|
if (hdl->m_contents)
|
|
Release(hdl->m_contents);
|
|
|
|
hdl->~MMHandleBlock();
|
|
|
|
Release(hdl);
|
|
}
|
|
|
|
MemoryManagerImpl *MemoryManagerImpl::GetInstance()
|
|
{
|
|
return &ms_instance;
|
|
}
|
|
|
|
MemoryManagerImpl MemoryManagerImpl::ms_instance;
|
|
|
|
MemoryManager *MemoryManager::GetInstance()
|
|
{
|
|
return MemoryManagerImpl::GetInstance();
|
|
}
|
|
}
|