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);
53 throw logic_error("no loader created");
56 queue.push_back(&managed);
59 void ResourceManager::remove_resource(Resource &r)
61 ManagedResource *loading = thread.get_resource();
62 if(loading && loading->resource==&r)
63 thread.set_resource(0);
65 remove_existing(resources, &r);
68 void ResourceManager::tick()
70 LoadingThread::State thread_state = thread.get_state();
71 if(thread_state==LoadingThread::SYNC_PENDING)
73 else if(thread_state==LoadingThread::IDLE && !queue.empty())
75 ManagedResource *managed = queue.front();
77 thread.set_resource(managed);
82 ResourceManager::ManagedResource::ManagedResource(Resource &r):
90 ResourceManager::LoadingThread::LoadingThread(ResourceManager &m):
99 void ResourceManager::LoadingThread::main()
101 while(state!=TERMINATING)
107 Resource::AsyncLoader *ldr = resource->loader;
108 bool finished = false;
109 while(!finished && !ldr->needs_sync())
110 finished = ldr->process();
113 state = LOAD_FINISHED;
115 state = SYNC_PENDING;
120 void ResourceManager::LoadingThread::set_resource(ManagedResource *r)
125 // Force finish to clean up the loader
126 state = LOAD_FINISHED;
135 void ResourceManager::LoadingThread::sync()
138 bool finished = (s==LOAD_FINISHED);
141 Resource::AsyncLoader *ldr = resource->loader;
142 while(!finished && ldr->needs_sync())
143 finished = ldr->process();
155 delete resource->loader;
156 resource->loader = 0;
164 void ResourceManager::LoadingThread::terminate()