diff --git a/base/main.cpp b/base/main.cpp index 900d73a28df..44b0aa908de 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 ec9fcaee6ae..67cb74d9ebd 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 350b88b5313..1c4eb1c2d23 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; ConfigManager(); diff --git a/common/singleton.h b/common/singleton.h index 2f721a65f7d..e17e401f8bc 100644 --- a/common/singleton.h +++ b/common/singleton.h @@ -39,8 +39,6 @@ private: Singleton(const Singleton &); Singleton &operator=(const Singleton &); - 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; }; /**