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;  };  /**  | 
