Browse Source

Fix a destruction order bug

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
3258d1c88c
3 changed files with 23 additions and 81 deletions
  1. 14 79
      src/anki/core/App.cpp
  2. 4 1
      src/anki/gr/gl/GrManager.cpp
  3. 5 1
      src/anki/gr/vulkan/GrManager.cpp

+ 14 - 79
src/anki/core/App.cpp

@@ -258,85 +258,20 @@ App::~App()
 
 void App::cleanup()
 {
-	if(m_script)
-	{
-		m_heapAlloc.deleteInstance(m_script);
-		m_script = nullptr;
-	}
-
-	if(m_scene)
-	{
-		m_heapAlloc.deleteInstance(m_scene);
-		m_scene = nullptr;
-	}
-
-	if(m_renderer)
-	{
-		m_heapAlloc.deleteInstance(m_renderer);
-		m_renderer = nullptr;
-	}
-
-	if(m_ui)
-	{
-		m_statsUi.reset(nullptr);
-
-		m_heapAlloc.deleteInstance(m_ui);
-		m_ui = nullptr;
-	}
-
-	if(m_resources)
-	{
-		m_heapAlloc.deleteInstance(m_resources);
-		m_resources = nullptr;
-	}
-
-	if(m_resourceFs)
-	{
-		m_heapAlloc.deleteInstance(m_resourceFs);
-		m_resourceFs = nullptr;
-	}
-
-	if(m_physics)
-	{
-		m_heapAlloc.deleteInstance(m_physics);
-		m_physics = nullptr;
-	}
-
-	if(m_stagingMem)
-	{
-		m_heapAlloc.deleteInstance(m_stagingMem);
-		m_stagingMem = nullptr;
-	}
-
-	if(m_threadpool)
-	{
-		m_heapAlloc.deleteInstance(m_threadpool);
-		m_threadpool = nullptr;
-	}
-
-	if(m_threadHive)
-	{
-		m_heapAlloc.deleteInstance(m_threadHive);
-		m_threadHive = nullptr;
-	}
-
-	if(m_gr)
-	{
-		GrManager::deleteInstance(m_gr);
-		m_gr = nullptr;
-	}
-
-	if(m_input)
-	{
-		m_heapAlloc.deleteInstance(m_input);
-		m_input = nullptr;
-	}
-
-	if(m_window)
-	{
-		m_heapAlloc.deleteInstance(m_window);
-		m_window = nullptr;
-	}
+	m_heapAlloc.deleteInstance(m_scene);
+	m_heapAlloc.deleteInstance(m_script);
+	m_heapAlloc.deleteInstance(m_renderer);
+	m_statsUi.reset(nullptr);
+	m_heapAlloc.deleteInstance(m_ui);
+	m_heapAlloc.deleteInstance(m_resources);
+	m_heapAlloc.deleteInstance(m_resourceFs);
+	m_heapAlloc.deleteInstance(m_physics);
+	m_heapAlloc.deleteInstance(m_stagingMem);
+	m_heapAlloc.deleteInstance(m_threadpool);
+	m_heapAlloc.deleteInstance(m_threadHive);
+	GrManager::deleteInstance(m_gr);
+	m_heapAlloc.deleteInstance(m_input);
+	m_heapAlloc.deleteInstance(m_window);
 
 #if ANKI_ENABLE_TRACE
 	if(CoreTracerSingleton::get().isInitialized())

+ 4 - 1
src/anki/gr/gl/GrManager.cpp

@@ -56,7 +56,10 @@ Error GrManager::newInstance(GrManagerInitInfo& init, GrManager*& gr)
 
 void GrManager::deleteInstance(GrManager* gr)
 {
-	ANKI_ASSERT(gr);
+	if(gr == nullptr)
+	{
+		return;
+	}
 
 	auto alloc = gr->m_alloc;
 	gr->~GrManager();

+ 5 - 1
src/anki/gr/vulkan/GrManager.cpp

@@ -56,7 +56,11 @@ Error GrManager::newInstance(GrManagerInitInfo& init, GrManager*& gr)
 
 void GrManager::deleteInstance(GrManager* gr)
 {
-	ANKI_ASSERT(gr);
+	if(gr == nullptr)
+	{
+		return;
+	}
+
 	auto alloc = gr->m_alloc;
 	gr->~GrManager();
 	alloc.deallocate(gr, 1);