]> git.tdb.fi Git - libs/gl.git/blobdiff - source/resourcemanager.cpp
Fix the resource disassociation loop in ~ResourceManager
[libs/gl.git] / source / resourcemanager.cpp
index a5c3691f9cb5caaae9d4f38af19ba6ac44c3bd7c..cdd032264345dae5d81d11bf17f10e3da9ed09d3 100644 (file)
@@ -1,5 +1,7 @@
+#include <algorithm>
 #include <msp/time/utils.h>
 #include "resourcemanager.h"
+#include "resourcewatcher.h"
 
 using namespace std;
 
@@ -21,8 +23,8 @@ ResourceManager::~ResourceManager()
 {
        thread.terminate();
 
-       for(ResourceMap::iterator i=resources.begin(); i!=resources.end(); ++i)
-               i->second.resource->set_manager(0);
+       while(!resources.empty())
+               resources.begin()->second.resource->set_manager(0);
 }
 
 void ResourceManager::set_loading_policy(LoadingPolicy p)
@@ -110,6 +112,16 @@ void ResourceManager::remove_resource(Resource &r)
        remove_existing(resources, &r);
 }
 
+void ResourceManager::watch_resource(const Resource &r, ResourceWatcher &w)
+{
+       get_item(resources, &r).add_watcher(w);
+}
+
+void ResourceManager::unwatch_resource(const Resource &r, ResourceWatcher &w)
+{
+       get_item(resources, &r).remove_watcher(w);
+}
+
 void ResourceManager::tick()
 {
        LoadingThread::State thread_state = thread.get_state();
@@ -211,12 +223,31 @@ void ResourceManager::ManagedResource::finish_loading()
        delete io;
        io = 0;
        data_size = resource->get_data_size();
+
+       for(vector<ResourceWatcher *>::const_iterator i=watchers.begin(); i!=watchers.end(); ++i)
+               (*i)->resource_loaded(*resource);
 }
 
 void ResourceManager::ManagedResource::unload()
 {
        resource->unload();
        loaded = false;
+
+       for(vector<ResourceWatcher *>::const_iterator i=watchers.begin(); i!=watchers.end(); ++i)
+               (*i)->resource_unloaded(*resource);
+}
+
+void ResourceManager::ManagedResource::add_watcher(ResourceWatcher &w)
+{
+       if(find(watchers.begin(), watchers.end(), &w)==watchers.end())
+               watchers.push_back(&w);
+}
+
+void ResourceManager::ManagedResource::remove_watcher(ResourceWatcher &w)
+{
+       vector<ResourceWatcher *>::iterator end = remove(watchers.begin(), watchers.end(), &w);
+       if(end!=watchers.end())
+               watchers.erase(end, watchers.end());
 }