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::set_loading_policy(LoadingPolicy p)
28 void ResourceManager::set_async_loads(bool a)
33 void ResourceManager::add_resource(Resource &r)
35 insert_unique(resources, &r, ManagedResource(r));
38 void *ResourceManager::get_data_for_resource(const Resource &r)
40 return &get_item(resources, &r);
43 void ResourceManager::set_resource_location(Resource &r, DataFile::Collection &c, const string &n)
45 ManagedResource &managed = get_item(resources, &r);
46 managed.collection = &c;
49 if(policy==LOAD_IMMEDIATELY)
53 void ResourceManager::load_resource(Resource &r)
55 ManagedResource &managed = get_item(resources, &r);
56 if(!managed.collection)
57 throw runtime_error("no location");
62 managed.start_loading();
65 queue.push_back(&managed);
68 while(!managed.loader->process()) ;
69 managed.finish_loading();
73 void ResourceManager::resource_used(const Resource &r)
75 ManagedResource *managed = reinterpret_cast<ManagedResource *>(r.get_manager_data());
76 if(!managed->loaded && !managed->loader && policy!=LOAD_MANUALLY)
77 load_resource(*managed->resource);
80 void ResourceManager::remove_resource(Resource &r)
82 ManagedResource *loading = thread.get_resource();
83 if(loading && loading->resource==&r)
84 thread.set_resource(0);
86 remove_existing(resources, &r);
89 void ResourceManager::tick()
91 LoadingThread::State thread_state = thread.get_state();
92 if(thread_state==LoadingThread::SYNC_PENDING)
94 else if(thread_state==LoadingThread::IDLE && !queue.empty())
96 ManagedResource *managed = queue.front();
98 thread.set_resource(managed);
103 ResourceManager::ManagedResource::ManagedResource(Resource &r):
111 void ResourceManager::ManagedResource::start_loading()
113 io = collection->open_raw(name);
114 loader = resource->load(*io);
119 throw logic_error("no loader created");
123 void ResourceManager::ManagedResource::finish_loading()
133 ResourceManager::LoadingThread::LoadingThread(ResourceManager &m):
142 void ResourceManager::LoadingThread::main()
144 while(state!=TERMINATING)
150 Resource::AsyncLoader *ldr = resource->loader;
151 bool finished = false;
152 while(!finished && !ldr->needs_sync())
153 finished = ldr->process();
156 state = LOAD_FINISHED;
158 state = SYNC_PENDING;
163 void ResourceManager::LoadingThread::set_resource(ManagedResource *r)
168 // Force finish to clean up the loader
169 state = LOAD_FINISHED;
178 void ResourceManager::LoadingThread::sync()
181 bool finished = (s==LOAD_FINISHED);
184 Resource::AsyncLoader *ldr = resource->loader;
185 while(!finished && ldr->needs_sync())
186 finished = ldr->process();
198 resource->finish_loading();
204 void ResourceManager::LoadingThread::terminate()