From fc55a5d49016f3dfce7a85edd63a9444ac90fdbe Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Tue, 17 Aug 2021 01:22:18 -0700 Subject: [PATCH] Session owned managers are now using std::unique_ptr --- kraken/KRAudioManager.cpp | 27 +++++--- kraken/KRAudioManager.h | 1 + kraken/KRContext.cpp | 120 ++++++++++++------------------------ kraken/KRContext.h | 24 ++++---- kraken/KRDeviceManager.cpp | 1 + kraken/KRTextureManager.cpp | 13 +++- kraken/KRTextureManager.h | 1 + 7 files changed, 84 insertions(+), 103 deletions(-) diff --git a/kraken/KRAudioManager.cpp b/kraken/KRAudioManager.cpp index 1f8e7dd..7bc8f93 100755 --- a/kraken/KRAudioManager.cpp +++ b/kraken/KRAudioManager.cpp @@ -1185,15 +1185,24 @@ void KRAudioManager::cleanupAudio() KRAudioManager::~KRAudioManager() { - for(unordered_map::iterator name_itr=m_sounds.begin(); name_itr != m_sounds.end(); name_itr++) { - delete (*name_itr).second; - } - - cleanupAudio(); - - for(std::vector::iterator itr = m_bufferPoolIdle.begin(); itr != m_bufferPoolIdle.end(); itr++) { - delete *itr; - } + // Must call destroy first + assert(m_sounds.empty()); + assert(m_bufferPoolIdle.empty()); +} + +void KRAudioManager::destroy() +{ + for (unordered_map::iterator name_itr = m_sounds.begin(); name_itr != m_sounds.end(); name_itr++) { + delete (*name_itr).second; + } + m_sounds.clear(); + + cleanupAudio(); + + for (std::vector::iterator itr = m_bufferPoolIdle.begin(); itr != m_bufferPoolIdle.end(); itr++) { + delete* itr; + } + m_bufferPoolIdle.clear(); } void KRAudioManager::makeCurrentContext() diff --git a/kraken/KRAudioManager.h b/kraken/KRAudioManager.h index 3c471e3..45766a2 100755 --- a/kraken/KRAudioManager.h +++ b/kraken/KRAudioManager.h @@ -96,6 +96,7 @@ class KRAudioManager : public KRResourceManager { public: KRAudioManager(KRContext &context); virtual ~KRAudioManager(); + void destroy(); virtual KRResource* loadResource(const std::string& name, const std::string& extension, KRDataBlock* data) override; virtual KRResource* getResource(const std::string& name, const std::string& extension) override; diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index ce0e998..16440ee 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -99,18 +99,18 @@ KRContext::KRContext(const KrInitializeInfo* initializeInfo) m_last_fully_streamed_frame = 0; m_absolute_time = 0.0f; - m_pBundleManager = new KRBundleManager(*this); - m_pPipelineManager = new KRPipelineManager(*this); - m_pTextureManager = new KRTextureManager(*this); - m_pMaterialManager = new KRMaterialManager(*this, m_pTextureManager, m_pPipelineManager); - m_pMeshManager = new KRMeshManager(*this); - m_pSceneManager = new KRSceneManager(*this); - m_pAnimationManager = new KRAnimationManager(*this); - m_pAnimationCurveManager = new KRAnimationCurveManager(*this); - m_pSoundManager = new KRAudioManager(*this); - m_pUnknownManager = new KRUnknownManager(*this); - m_pShaderManager = new KRShaderManager(*this); - m_pSourceManager = new KRSourceManager(*this); + m_pBundleManager = std::make_unique(*this); + m_pPipelineManager = std::make_unique(*this); + m_pTextureManager = std::make_unique(*this); + m_pMaterialManager = std::make_unique(*this, m_pTextureManager.get(), m_pPipelineManager.get()); + m_pMeshManager = std::make_unique(*this); + m_pSceneManager = std::make_unique(*this); + m_pAnimationManager = std::make_unique(*this); + m_pAnimationCurveManager = std::make_unique(*this); + m_pSoundManager = std::make_unique(*this); + m_pUnknownManager = std::make_unique(*this); + m_pShaderManager = std::make_unique(*this); + m_pSourceManager = std::make_unique(*this); m_deviceManager = std::make_unique(*this); m_surfaceManager = std::make_unique(*this); m_streamingEnabled = true; @@ -138,63 +138,25 @@ KRContext::KRContext(const KrInitializeInfo* initializeInfo) KRContext::~KRContext() { m_presentationThread->stop(); - if(m_pSceneManager) { - delete m_pSceneManager; - m_pSceneManager = NULL; - } - - if(m_pMeshManager) { - delete m_pMeshManager; - m_pMeshManager = NULL; - } - - if(m_pTextureManager) { - delete m_pTextureManager; - m_pTextureManager = NULL; - } - - if(m_pMaterialManager) { - delete m_pMaterialManager; - m_pMaterialManager = NULL; - } - - if(m_pPipelineManager) { - delete m_pPipelineManager; - m_pPipelineManager = NULL; - } - - if(m_pAnimationManager) { - delete m_pAnimationManager; - m_pAnimationManager = NULL; - } - - if(m_pAnimationCurveManager) { - delete m_pAnimationCurveManager; - m_pAnimationCurveManager = NULL; - } - - if(m_pSoundManager) { - delete m_pSoundManager; - m_pSoundManager = NULL; - } - - if(m_pSourceManager) { - delete m_pSourceManager; - m_pSourceManager = NULL; - } - - if(m_pUnknownManager) { - delete m_pUnknownManager; - m_pUnknownManager = NULL; - } - - // The bundles must be destroyed last, as the other objects may be using mmap'ed data from bundles - if(m_pBundleManager) { - delete m_pBundleManager; - m_pBundleManager = NULL; - } + m_pSceneManager.reset(); + m_pMeshManager.reset(); + m_pMaterialManager.reset(); + m_pTextureManager->destroy(); + m_pTextureManager.reset(); + m_pPipelineManager.reset(); + m_pAnimationManager.reset(); + m_pAnimationCurveManager.reset(); + m_pSoundManager->destroy(); + m_pSoundManager.reset(); + m_pSourceManager.reset(); + m_pUnknownManager.reset(); + m_pShaderManager.reset(); m_surfaceManager.reset(); m_deviceManager.reset(); + + // The bundles must be destroyed last, as the other objects may be using mmap'ed data from bundles + m_pBundleManager.reset(); + if (m_resourceMap) { delete m_resourceMap; @@ -229,37 +191,37 @@ void KRContext::Log(log_level level, const std::string message_format, ...) } KRBundleManager *KRContext::getBundleManager() { - return m_pBundleManager; + return m_pBundleManager.get(); } KRSceneManager *KRContext::getSceneManager() { - return m_pSceneManager; + return m_pSceneManager.get(); } KRTextureManager *KRContext::getTextureManager() { - return m_pTextureManager; + return m_pTextureManager.get(); } KRMaterialManager *KRContext::getMaterialManager() { - return m_pMaterialManager; + return m_pMaterialManager.get(); } KRPipelineManager *KRContext::getPipelineManager() { - return m_pPipelineManager; + return m_pPipelineManager.get(); } KRMeshManager *KRContext::getMeshManager() { - return m_pMeshManager; + return m_pMeshManager.get(); } KRAnimationManager *KRContext::getAnimationManager() { - return m_pAnimationManager; + return m_pAnimationManager.get(); } KRAnimationCurveManager *KRContext::getAnimationCurveManager() { - return m_pAnimationCurveManager; + return m_pAnimationCurveManager.get(); } KRAudioManager *KRContext::getAudioManager() { - return m_pSoundManager; + return m_pSoundManager.get(); } KRShaderManager *KRContext::getShaderManager() { - return m_pShaderManager; + return m_pShaderManager.get(); } KRSourceManager *KRContext::getSourceManager() { - return m_pSourceManager; + return m_pSourceManager.get(); } KRSurfaceManager* KRContext::getSurfaceManager() { return m_surfaceManager.get(); @@ -268,7 +230,7 @@ KRDeviceManager* KRContext::getDeviceManager() { return m_deviceManager.get(); } KRUnknownManager *KRContext::getUnknownManager() { - return m_pUnknownManager; + return m_pUnknownManager.get(); } std::vector KRContext::getResources() { diff --git a/kraken/KRContext.h b/kraken/KRContext.h index 0fec272..25e2fdb 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -168,18 +168,18 @@ public: void addResource(KRResource* resource, const std::string& name); void removeResource(KRResource* resource); private: - KRBundleManager *m_pBundleManager; - KRSceneManager *m_pSceneManager; - KRTextureManager *m_pTextureManager; - KRMaterialManager *m_pMaterialManager; - KRPipelineManager *m_pPipelineManager; - KRMeshManager *m_pMeshManager; - KRAnimationManager *m_pAnimationManager; - KRAnimationCurveManager *m_pAnimationCurveManager; - KRAudioManager *m_pSoundManager; - KRUnknownManager *m_pUnknownManager; - KRShaderManager *m_pShaderManager; - KRSourceManager *m_pSourceManager; + std::unique_ptr m_pBundleManager; + std::unique_ptr m_pSceneManager; + std::unique_ptr m_pTextureManager; + std::unique_ptr m_pMaterialManager; + std::unique_ptr m_pPipelineManager; + std::unique_ptr m_pMeshManager; + std::unique_ptr m_pAnimationManager; + std::unique_ptr m_pAnimationCurveManager; + std::unique_ptr m_pSoundManager; + std::unique_ptr m_pUnknownManager; + std::unique_ptr m_pShaderManager; + std::unique_ptr m_pSourceManager; std::unique_ptr m_deviceManager; std::unique_ptr m_surfaceManager; diff --git a/kraken/KRDeviceManager.cpp b/kraken/KRDeviceManager.cpp index 43fb7a6..0082034 100644 --- a/kraken/KRDeviceManager.cpp +++ b/kraken/KRDeviceManager.cpp @@ -42,6 +42,7 @@ KRDeviceManager::KRDeviceManager(KRContext& context) KRDeviceManager::~KRDeviceManager() { destroyDevices(); + if (m_vulkanInstance != VK_NULL_HANDLE) { vkDestroyInstance(m_vulkanInstance, NULL); m_vulkanInstance = VK_NULL_HANDLE; diff --git a/kraken/KRTextureManager.cpp b/kraken/KRTextureManager.cpp index 1b3f842..db8996b 100755 --- a/kraken/KRTextureManager.cpp +++ b/kraken/KRTextureManager.cpp @@ -53,10 +53,17 @@ KRTextureManager::KRTextureManager(KRContext &context) : KRResourceManager(conte _clearGLState(); } +void KRTextureManager::destroy() +{ + for (unordered_map::iterator itr = m_textures.begin(); itr != m_textures.end(); ++itr) { + delete (*itr).second; + } + m_textures.clear(); +} + KRTextureManager::~KRTextureManager() { - for(unordered_map::iterator itr = m_textures.begin(); itr != m_textures.end(); ++itr){ - delete (*itr).second; - } + // Must call destroy() first + assert(m_textures.empty()); } void KRTextureManager::_clearGLState() diff --git a/kraken/KRTextureManager.h b/kraken/KRTextureManager.h index 3885d79..9d2e135 100755 --- a/kraken/KRTextureManager.h +++ b/kraken/KRTextureManager.h @@ -47,6 +47,7 @@ class KRTextureManager : public KRResourceManager { public: KRTextureManager(KRContext &context); virtual ~KRTextureManager(); + void destroy(); virtual KRResource* loadResource(const std::string& name, const std::string& extension, KRDataBlock* data) override; virtual KRResource* getResource(const std::string& name, const std::string& extension) override;