diff options
-rw-r--r-- | base/main.cpp | 2 | ||||
-rw-r--r-- | common/config-manager.cpp | 22 | ||||
-rw-r--r-- | common/config-manager.h | 3 | ||||
-rw-r--r-- | common/singleton.h | 4 |
4 files changed, 28 insertions, 3 deletions
diff --git a/base/main.cpp b/base/main.cpp index 900d73a28d..44b0aa908d 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -408,6 +408,8 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { #if defined(ONE_PLUGIN_AT_A_TIME) && defined(DYNAMIC_MODULES) // do our best to prevent fragmentation by unloading as soon as we can PluginManager::instance().unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL, false); + // reallocate the config manager to get rid of any fragmentation + ConfMan.defragment(); #endif // Did an error occur ? diff --git a/common/config-manager.cpp b/common/config-manager.cpp index ec9fcaee6a..67cb74d9eb 100644 --- a/common/config-manager.cpp +++ b/common/config-manager.cpp @@ -53,6 +53,27 @@ const char *ConfigManager::kKeymapperDomain = "keymapper"; ConfigManager::ConfigManager() : _activeDomain(0) { } +void ConfigManager::defragment() { + ConfigManager *newInstance = new ConfigManager(); + newInstance->copyFrom(*_singleton); + delete _singleton; + _singleton = newInstance; +} + +void ConfigManager::copyFrom(ConfigManager &source) { + _transientDomain = source._transientDomain; + _gameDomains = source._gameDomains; + _appDomain = source._appDomain; + _defaultsDomain = source._defaultsDomain; +#ifdef ENABLE_KEYMAPPER + _keymapperDomain = source._keymapperDomain; +#endif + _domainSaveOrder = source._domainSaveOrder; + _activeDomainName = source._activeDomainName; + _activeDomain = &_gameDomains[_activeDomainName]; + _filename = source._filename; +} + void ConfigManager::loadDefaultConfigFile() { // Open the default config file @@ -596,7 +617,6 @@ bool ConfigManager::hasGameDomain(const String &domName) const { #pragma mark - - void ConfigManager::Domain::setDomainComment(const String &comment) { _domainComment = comment; } diff --git a/common/config-manager.h b/common/config-manager.h index 350b88b531..1c4eb1c2d2 100644 --- a/common/config-manager.h +++ b/common/config-manager.h @@ -141,6 +141,9 @@ public: const DomainMap & getGameDomains() const { return _gameDomains; } DomainMap & getGameDomains() { return _gameDomains; } + static void defragment(); // move in memory to reduce fragmentation + void copyFrom(ConfigManager &source); + private: friend class Singleton<SingletonBaseType>; ConfigManager(); diff --git a/common/singleton.h b/common/singleton.h index 2f721a65f7..e17e401f8b 100644 --- a/common/singleton.h +++ b/common/singleton.h @@ -39,8 +39,6 @@ private: Singleton<T>(const Singleton<T> &); Singleton<T> &operator=(const Singleton<T> &); - static T *_singleton; - /** * The default object factory used by the template class Singleton. * By specialising this template function, one can make a singleton use a @@ -89,6 +87,8 @@ protected: #endif typedef T SingletonBaseType; + + static T *_singleton; }; /** |