소스 검색

Fix ResourceLoader

Daniele Bartolini 12 년 전
부모
커밋
95ea4e752f
2개의 변경된 파일22개의 추가작업 그리고 9개의 파일을 삭제
  1. 18 9
      engine/resource/ResourceLoader.cpp
  2. 4 0
      engine/resource/ResourceLoader.h

+ 18 - 9
engine/resource/ResourceLoader.cpp

@@ -34,6 +34,7 @@ namespace crown
 //-----------------------------------------------------------------------------
 ResourceLoader::ResourceLoader(Bundle& bundle, Allocator& resource_heap) :
 	m_thread("resource-loader"),
+	m_should_run(false),
 	m_bundle(bundle),
 	m_resource_heap(resource_heap),
 	m_num_requests(0),
@@ -94,25 +95,33 @@ void* ResourceLoader::load_resource_data(LoadResourceId id) const
 //-----------------------------------------------------------------------------
 int32_t ResourceLoader::run()
 {
-	while (m_thread.is_running())
+	while (m_should_run)
 	{
 		m_requests_mutex.lock();
-		while (m_requests.empty())
+		while (m_requests.empty() && m_should_run)
 		{
 			m_full.wait(m_requests_mutex);
 		}
 
-		LoadResource request = m_requests.front();
-		m_requests.pop_front();
+		if (m_should_run)
+		{
+			LoadResource request = m_requests.front();
+			m_requests.pop_front();
 
-		m_requests_mutex.unlock();
+			m_requests_mutex.unlock();
 
-		m_results[request.id % MAX_LOAD_REQUESTS].status = LRS_LOADING;
+			m_results[request.id % MAX_LOAD_REQUESTS].status = LRS_LOADING;
 
-		void* data = resource_on_load(request.type, m_resource_heap, m_bundle, request.resource);
+			void* data = resource_on_load(request.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;
+			m_results[request.id % MAX_LOAD_REQUESTS].data = data;
+			m_results[request.id % MAX_LOAD_REQUESTS].status = LRS_LOADED;
+		}
+		else
+		{
+			// Release the mutex when exiting
+			m_requests_mutex.unlock();
+		}
 	}
 
 	return 0;

+ 4 - 0
engine/resource/ResourceLoader.h

@@ -88,11 +88,14 @@ public:
 
 	void start()
 	{
+		m_should_run = true;
 		m_thread.start(background_run, this);
 	}
 
 	void stop()
 	{
+		m_should_run = false;
+		m_full.signal();
 		m_thread.stop();
 	}
 
@@ -106,6 +109,7 @@ private:
 private:
 
 	Thread					m_thread;
+	bool					m_should_run;
 
 	// Whether to look for resources
 	Bundle&					m_bundle;