1 #include <msp/time/utils.h>
2 #include "resourcemanager.h"
9 ResourceManager::ResourceManager():
10 policy(LOAD_ON_DEMAND),
15 ResourceManager::~ResourceManager()
20 void ResourceManager::add_resource(Resource &r)
22 insert_unique(resources, &r, ManagedResource(r));
25 void ResourceManager::set_resource_location(Resource &r, DataFile::Collection &c, const string &n)
27 ManagedResource &managed = get_item(resources, &r);
28 managed.collection = &c;
31 if(policy==LOAD_IMMEDIATELY)
35 void ResourceManager::load_resource(const Resource &r)
37 ManagedResource &managed = get_item(resources, &r);
38 if(!managed.collection)
39 throw runtime_error("no location");
44 managed.io = managed.collection->open_raw(managed.name);
45 managed.loader = managed.resource->load(*managed.io);
47 queue.push_back(&managed);
50 void ResourceManager::remove_resource(Resource &r)
52 ManagedResource *loading = thread.get_resource();
53 if(loading && loading->resource==&r)
54 thread.set_resource(0);
56 remove_existing(resources, &r);
59 void ResourceManager::tick()
61 LoadingThread::State thread_state = thread.get_state();
62 if(thread_state==LoadingThread::SYNC_PENDING)
64 else if(thread_state==LoadingThread::IDLE && !queue.empty())
66 ManagedResource *managed = queue.front();
68 thread.set_resource(managed);
73 ResourceManager::ManagedResource::ManagedResource(Resource &r):
81 ResourceManager::LoadingThread::LoadingThread(ResourceManager &m):
90 void ResourceManager::LoadingThread::main()
92 while(state!=TERMINATING)
98 Resource::AsyncLoader *ldr = resource->loader;
99 bool finished = false;
100 while(!finished && !ldr->needs_sync())
101 finished = ldr->process();
104 state = LOAD_FINISHED;
106 state = SYNC_PENDING;
111 void ResourceManager::LoadingThread::set_resource(ManagedResource *r)
116 // Force finish to clean up the loader
117 state = LOAD_FINISHED;
126 void ResourceManager::LoadingThread::sync()
129 bool finished = (s==LOAD_FINISHED);
132 Resource::AsyncLoader *ldr = resource->loader;
133 while(!finished && ldr->needs_sync())
134 finished = ldr->process();
146 delete resource->loader;
147 resource->loader = 0;
155 void ResourceManager::LoadingThread::terminate()