1 #include <msp/time/utils.h>
2 #include "resourcemanager.h"
9 ResourceManager::ResourceManager():
10 policy(LOAD_ON_DEMAND),
15 ResourceManager::~ResourceManager()
19 for(ResourceMap::iterator i=resources.begin(); i!=resources.end(); ++i)
20 i->second.resource->set_manager(0);
23 void ResourceManager::add_resource(Resource &r)
25 insert_unique(resources, &r, ManagedResource(r));
28 void ResourceManager::set_resource_location(Resource &r, DataFile::Collection &c, const string &n)
30 ManagedResource &managed = get_item(resources, &r);
31 managed.collection = &c;
34 if(policy==LOAD_IMMEDIATELY)
38 void ResourceManager::load_resource(const Resource &r)
40 ManagedResource &managed = get_item(resources, &r);
41 if(!managed.collection)
42 throw runtime_error("no location");
47 managed.io = managed.collection->open_raw(managed.name);
48 managed.loader = managed.resource->load(*managed.io);
50 queue.push_back(&managed);
53 void ResourceManager::remove_resource(Resource &r)
55 ManagedResource *loading = thread.get_resource();
56 if(loading && loading->resource==&r)
57 thread.set_resource(0);
59 remove_existing(resources, &r);
62 void ResourceManager::tick()
64 LoadingThread::State thread_state = thread.get_state();
65 if(thread_state==LoadingThread::SYNC_PENDING)
67 else if(thread_state==LoadingThread::IDLE && !queue.empty())
69 ManagedResource *managed = queue.front();
71 thread.set_resource(managed);
76 ResourceManager::ManagedResource::ManagedResource(Resource &r):
84 ResourceManager::LoadingThread::LoadingThread(ResourceManager &m):
93 void ResourceManager::LoadingThread::main()
95 while(state!=TERMINATING)
101 Resource::AsyncLoader *ldr = resource->loader;
102 bool finished = false;
103 while(!finished && !ldr->needs_sync())
104 finished = ldr->process();
107 state = LOAD_FINISHED;
109 state = SYNC_PENDING;
114 void ResourceManager::LoadingThread::set_resource(ManagedResource *r)
119 // Force finish to clean up the loader
120 state = LOAD_FINISHED;
129 void ResourceManager::LoadingThread::sync()
132 bool finished = (s==LOAD_FINISHED);
135 Resource::AsyncLoader *ldr = resource->loader;
136 while(!finished && ldr->needs_sync())
137 finished = ldr->process();
149 delete resource->loader;
150 resource->loader = 0;
158 void ResourceManager::LoadingThread::terminate()