aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/main.cpp2
-rw-r--r--common/config-manager.cpp22
-rw-r--r--common/config-manager.h3
-rw-r--r--common/singleton.h4
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;
};
/**