aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/kernel
diff options
context:
space:
mode:
authorFilippos Karapetis2011-02-02 15:35:05 +0000
committerFilippos Karapetis2011-02-02 15:35:05 +0000
commita4a09ac2845f3bf4d3ba5985285f9b393546da66 (patch)
tree061379da38ea743ff3a16865099170cffc5da8f9 /engines/sword25/kernel
parent24e983610dfb118c943d6a1867bf3ea5d81e18e4 (diff)
downloadscummvm-rg350-a4a09ac2845f3bf4d3ba5985285f9b393546da66.tar.gz
scummvm-rg350-a4a09ac2845f3bf4d3ba5985285f9b393546da66.tar.bz2
scummvm-rg350-a4a09ac2845f3bf4d3ba5985285f9b393546da66.zip
SWORD25: Added a cache minimum and maximum limit, so that the resources loaded will always be inside these limits. Resources can now be forcefully unlocked when the upper limit is reached
svn-id: r55722
Diffstat (limited to 'engines/sword25/kernel')
-rw-r--r--engines/sword25/kernel/resmanager.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/engines/sword25/kernel/resmanager.cpp b/engines/sword25/kernel/resmanager.cpp
index 19da68d4bf..5d9417bdb1 100644
--- a/engines/sword25/kernel/resmanager.cpp
+++ b/engines/sword25/kernel/resmanager.cpp
@@ -43,7 +43,11 @@ namespace Sword25 {
// Sets the amount of resources that are simultaneously loaded.
// This needs to be a relatively high number, as all the animation
// frames in each scene are loaded as separate resources.
-#define SWORD25_RESOURCECACHE_MAX 100
+#define SWORD25_RESOURCECACHE_MIN 200
+// The maximum number of loaded resources. If more than these resources
+// are loaded, the resource manager will start purging resources till it
+// hits the minimum limit above
+#define SWORD25_RESOURCECACHE_MAX 300
ResourceManager::~ResourceManager() {
// Clear all unlocked resources
@@ -89,7 +93,7 @@ void ResourceManager::deleteResourcesIfNecessary() {
return;
// Keep deleting resources until the memory usage of the process falls below the set maximum limit.
- // The list is processed backwards in order to first release those resources who have been
+ // The list is processed backwards in order to first release those resources that have been
// not been accessed for the longest
Common::List<Resource *>::iterator iter = _resources.end();
do {
@@ -98,7 +102,20 @@ void ResourceManager::deleteResourcesIfNecessary() {
// The resource may be released only if it isn't locked
if ((*iter)->getLockCount() == 0)
iter = deleteResource(*iter);
- } while (iter != _resources.begin() && _resources.size() >= SWORD25_RESOURCECACHE_MAX);
+ } while (iter != _resources.begin() && _resources.size() >= SWORD25_RESOURCECACHE_MIN);
+
+ // Are we still above the minimum? If yes, then start releasing locked resources
+ iter = _resources.end();
+ do {
+ --iter;
+
+ // Forcibly unlock the resource
+ while ((*iter)->getLockCount() > 0) {
+ (*iter)->release();
+ };
+
+ iter = deleteResource(*iter);
+ } while (iter != _resources.begin() && _resources.size() >= SWORD25_RESOURCECACHE_MIN);
}
/**