fixed leak

This commit is contained in:
Mikulas Florek 2019-11-24 11:58:01 +01:00
parent b6fafb5cf9
commit 9c2a2fb39d
5 changed files with 23 additions and 5 deletions

View file

@ -2,6 +2,8 @@
#include "profiler_ui.h"
#include "engine/crt.h"
#include "engine/debug.h"
#include "engine/engine.h"
#include "engine/fibers.h"
#include "engine/file_system.h"
#include "engine/job_system.h"
@ -9,11 +11,10 @@
#include "engine/math.h"
#include "engine/mt/atomic.h"
#include "engine/os.h"
#include "engine/page_allocator.h"
#include "engine/profiler.h"
#include "engine/resource.h"
#include "engine/resource_manager.h"
#include "engine/debug.h"
#include "engine/engine.h"
#include "utils.h"
@ -418,6 +419,9 @@ void ProfilerUIImpl::onGUIMemoryProfiler()
m_main_allocator.checkGuards();
}
ImGui::Text("Total size: %.3fMB", (m_main_allocator.getTotalSize() / 1024) / 1024.0f);
const PageAllocator& page_allocator = m_engine.getPageAllocator();
const float reserved_pages_size = (page_allocator.getReservedCount() * PageAllocator::PAGE_SIZE) / (1024.f * 1024.f);
ImGui::Text("Page allocator: %.3fMB", reserved_pages_size);
ImGui::Columns(2, "memc");
for (auto* child : m_allocation_root->m_children)

View file

@ -10,6 +10,7 @@ namespace Lumix
PageAllocator::~PageAllocator()
{
ASSERT(allocated_count == 0);
void* p = free_pages;
while (p) {
void* tmp = p;
@ -34,12 +35,14 @@ void PageAllocator::unlock()
void* PageAllocator::allocate(bool lock)
{
if (lock) mutex.enter();
++allocated_count;
if (free_pages) {
void* tmp = free_pages;
memcpy(&free_pages, free_pages, sizeof(free_pages));
if (lock) mutex.exit();
return tmp;
}
++reserved_count;
if (lock) mutex.exit();
return VirtualAlloc(nullptr, PAGE_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
}
@ -48,6 +51,7 @@ void* PageAllocator::allocate(bool lock)
void PageAllocator::deallocate(void* mem, bool lock)
{
if (lock) mutex.enter();
--allocated_count;
memcpy(mem, &free_pages, sizeof(free_pages));
free_pages = mem;
if (lock) mutex.exit();

View file

@ -18,11 +18,15 @@ public:
void* allocate(bool lock);
void deallocate(void* mem, bool lock);
u32 getAllocatedCount() const { return allocated_count; }
u32 getReservedCount() const { return reserved_count; }
void lock();
void unlock();
private:
u32 allocated_count = 0;
u32 reserved_count = 0;
void* free_pages = nullptr;
MT::CriticalSection mutex;
};

View file

@ -71,7 +71,7 @@ namespace Lumix
LuaScriptManager& getScriptManager() { return m_script_manager; }
Engine& m_engine;
Debug::Allocator m_allocator;
IAllocator& m_allocator;
LuaScriptManager m_script_manager;
};

View file

@ -2109,7 +2109,10 @@ struct PipelineImpl final : Pipeline
do {} while(false)
PROFILE_FUNCTION();
if(m_cmds->header.size == 0 && m_cmds->header.next == nullptr) return;
if(m_cmds->header.size == 0 && m_cmds->header.next == nullptr) {
m_pipeline->m_renderer.getEngine().getPageAllocator().deallocate(m_cmds, true);
return;
}
const u64 blend_state = gpu::getBlendStateBits(gpu::BlendFactors::ONE, gpu::BlendFactors::ONE, gpu::BlendFactors::ONE, gpu::BlendFactors::ONE);
CmdPage* page = m_cmds;
@ -2237,7 +2240,10 @@ struct PipelineImpl final : Pipeline
cmd += sizeof(T); \
do {} while(false)
PROFILE_FUNCTION();
if(m_cmds->header.size == 0 && !m_cmds->header.next) return;
if(m_cmds->header.size == 0 && !m_cmds->header.next) {
m_pipeline->m_renderer.getEngine().getPageAllocator().deallocate(m_cmds, true);
return;
}
Renderer& renderer = m_pipeline->m_renderer;