From 5204e3ac03c8c750b5f8d93d2f6e08f77eaed26c Mon Sep 17 00:00:00 2001 From: BenDol Date: Wed, 2 Apr 2014 00:30:17 +1300 Subject: [PATCH] Proper termination and initialization of the ConfigManager. --- modules/corelib/corelib.otmod | 3 +++ src/framework/core/application.cpp | 10 +++++----- src/framework/core/configmanager.cpp | 21 ++++++++++++++++++++- src/framework/core/configmanager.h | 3 ++- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/modules/corelib/corelib.otmod b/modules/corelib/corelib.otmod index 842a206f..d158c2d2 100644 --- a/modules/corelib/corelib.otmod +++ b/modules/corelib/corelib.otmod @@ -24,3 +24,6 @@ Module dofile 'inputmessage' dofile 'outputmessage' + + @onUnload: | + g_settings = nil \ No newline at end of file diff --git a/src/framework/core/application.cpp b/src/framework/core/application.cpp index cd301404..ae07adbb 100644 --- a/src/framework/core/application.cpp +++ b/src/framework/core/application.cpp @@ -90,6 +90,9 @@ void Application::init(std::vector& args) m_startupOptions = startupOptions; + // initialize configs + g_configs.init(); + // initialize resources g_resources.init(args[0].c_str()); @@ -125,11 +128,8 @@ void Application::terminate() Connection::terminate(); #endif - // save configurations - ConfigPtr settings = g_configs.getSettings(); - if(settings) { - settings->save(); - } + // release configs + g_configs.terminate(); // release resources g_resources.terminate(); diff --git a/src/framework/core/configmanager.cpp b/src/framework/core/configmanager.cpp index b0b6e867..2e291ed8 100644 --- a/src/framework/core/configmanager.cpp +++ b/src/framework/core/configmanager.cpp @@ -24,11 +24,29 @@ ConfigManager g_configs; -ConfigManager::ConfigManager() +void ConfigManager::init() { m_settings = ConfigPtr(new Config()); } +void ConfigManager::terminate() +{ + if(m_settings) { + // ensure settings are saved + m_settings->save(); + + m_settings->unload(); + m_settings = nullptr; + } + + for(ConfigPtr config : m_configs) { + config->unload(); + config = nullptr; + } + + m_configs.clear(); +} + ConfigPtr ConfigManager::getSettings() { return m_settings; @@ -79,6 +97,7 @@ bool ConfigManager::unload(const std::string& file) if(config) { config->unload(); m_configs.remove(config); + config = nullptr; return true; } return false; diff --git a/src/framework/core/configmanager.h b/src/framework/core/configmanager.h index 81443751..a49f084b 100644 --- a/src/framework/core/configmanager.h +++ b/src/framework/core/configmanager.h @@ -29,7 +29,8 @@ class ConfigManager { public: - ConfigManager(); + void init(); + void terminate(); ConfigPtr getSettings(); ConfigPtr get(const std::string& file);