|
|
@@ -33,94 +33,88 @@ namespace crown
|
|
|
{
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-ResourceLoader::ResourceLoader(Bundle& bundle, Allocator& resource_heap) :
|
|
|
- m_thread(),
|
|
|
- m_should_run(false),
|
|
|
- m_bundle(bundle),
|
|
|
- m_resource_heap(resource_heap),
|
|
|
- m_num_requests(0),
|
|
|
- m_requests(default_allocator())
|
|
|
+ResourceLoader::ResourceLoader(Bundle& bundle, Allocator& resource_heap)
|
|
|
+ : m_thread()
|
|
|
+ , m_bundle(bundle)
|
|
|
+ , m_resource_heap(resource_heap)
|
|
|
+ , m_requests(default_allocator())
|
|
|
+ , m_loaded(default_allocator())
|
|
|
+ , m_exit(false)
|
|
|
{
|
|
|
- for (uint32_t i = 0; i < MAX_LOAD_REQUESTS; i++)
|
|
|
- {
|
|
|
- m_results[i].status = LRS_NO_INFORMATION;
|
|
|
- m_results[i].data = NULL;
|
|
|
- }
|
|
|
+ m_thread.start(ResourceLoader::thread_proc, this);
|
|
|
}
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-LoadResourceId ResourceLoader::load_resource(ResourceId id)
|
|
|
+ResourceLoader::~ResourceLoader()
|
|
|
{
|
|
|
- m_requests_mutex.lock();
|
|
|
-
|
|
|
- LoadResourceId lr_id = m_num_requests++;
|
|
|
- LoadResource lr;
|
|
|
- lr.id = lr_id;
|
|
|
- lr.resource = id;
|
|
|
-
|
|
|
- queue::push_back(m_requests, lr);
|
|
|
-
|
|
|
- m_results[lr_id % MAX_LOAD_REQUESTS].status = LRS_QUEUED;
|
|
|
+ m_exit = true;
|
|
|
+}
|
|
|
|
|
|
- m_requests_mutex.unlock();
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+void ResourceLoader::load(ResourceId id)
|
|
|
+{
|
|
|
+ add_request(id);
|
|
|
+}
|
|
|
|
|
|
- m_full.signal();
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+void ResourceLoader::flush()
|
|
|
+{
|
|
|
+ while (num_requests()) {}
|
|
|
+}
|
|
|
|
|
|
- return lr_id;
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+void ResourceLoader::add_request(ResourceId id)
|
|
|
+{
|
|
|
+ ScopedMutex sm(m_mutex);
|
|
|
+ queue::push_back(m_requests, id);
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-LoadResourceStatus ResourceLoader::load_resource_status(LoadResourceId id) const
|
|
|
+uint32_t ResourceLoader::num_requests()
|
|
|
{
|
|
|
- if (m_num_requests - id > MAX_LOAD_REQUESTS)
|
|
|
- {
|
|
|
- return LRS_NO_INFORMATION;
|
|
|
- }
|
|
|
+ ScopedMutex sm(m_mutex);
|
|
|
+ return queue::size(m_requests);
|
|
|
+}
|
|
|
|
|
|
- return m_results[id % MAX_LOAD_REQUESTS].status;
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+void ResourceLoader::add_loaded(ResourceData data)
|
|
|
+{
|
|
|
+ ScopedMutex sm(m_loaded_mutex);
|
|
|
+ queue::push_back(m_loaded, data);
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-void* ResourceLoader::load_resource_data(LoadResourceId id) const
|
|
|
+void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
|
|
|
{
|
|
|
- if (m_num_requests - id > MAX_LOAD_REQUESTS)
|
|
|
+ ScopedMutex sm(m_loaded_mutex);
|
|
|
+ uint32_t num = queue::size(m_loaded);
|
|
|
+ for (uint32_t i = 0; i < num; i++)
|
|
|
{
|
|
|
- return NULL;
|
|
|
+ array::push_back(loaded, queue::front(m_loaded));
|
|
|
+ queue::pop_front(m_loaded);
|
|
|
}
|
|
|
-
|
|
|
- return m_results[id % MAX_LOAD_REQUESTS].data;
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
int32_t ResourceLoader::run()
|
|
|
{
|
|
|
- while (m_should_run)
|
|
|
+ while (!m_exit)
|
|
|
{
|
|
|
- m_requests_mutex.lock();
|
|
|
- while (queue::empty(m_requests) && m_should_run)
|
|
|
- {
|
|
|
- m_full.wait(m_requests_mutex);
|
|
|
- }
|
|
|
-
|
|
|
- if (m_should_run)
|
|
|
- {
|
|
|
- LoadResource request = queue::front(m_requests);
|
|
|
- queue::pop_front(m_requests);
|
|
|
-
|
|
|
- m_requests_mutex.unlock();
|
|
|
-
|
|
|
- m_results[request.id % MAX_LOAD_REQUESTS].status = LRS_LOADING;
|
|
|
-
|
|
|
- void* data = resource_on_load(request.resource.type, m_resource_heap, m_bundle, request.resource);
|
|
|
-
|
|
|
- m_results[request.id % MAX_LOAD_REQUESTS].data = data;
|
|
|
- m_results[request.id % MAX_LOAD_REQUESTS].status = LRS_LOADED;
|
|
|
- }
|
|
|
- else
|
|
|
+ m_mutex.lock();
|
|
|
+ if (queue::empty(m_requests))
|
|
|
{
|
|
|
- // Release the mutex when exiting
|
|
|
- m_requests_mutex.unlock();
|
|
|
+ m_mutex.unlock();
|
|
|
+ continue;
|
|
|
}
|
|
|
+ ResourceId id = queue::front(m_requests);
|
|
|
+ m_mutex.unlock();
|
|
|
+
|
|
|
+ ResourceData rd;
|
|
|
+ rd.id = id;
|
|
|
+ rd.data = resource_on_load(id.type, m_resource_heap, m_bundle, id);
|
|
|
+ add_loaded(rd);
|
|
|
+ m_mutex.lock();
|
|
|
+ queue::pop_front(m_requests);
|
|
|
+ m_mutex.unlock();
|
|
|
}
|
|
|
|
|
|
return 0;
|