ソースを参照

resource: use ConditionVariable instead of polling

Daniele Bartolini 7 年 前
コミット
8fc3c967a3
2 ファイル変更11 行追加7 行削除
  1. 9 7
      src/resource/resource_loader.cpp
  2. 2 0
      src/resource/resource_loader.h

+ 9 - 7
src/resource/resource_loader.cpp

@@ -38,6 +38,7 @@ ResourceLoader::ResourceLoader(Filesystem& data_filesystem)
 ResourceLoader::~ResourceLoader()
 {
 	_exit = true;
+	_requests_condition.signal(); // Spurious wake to exit thread
 	_thread.stop();
 }
 
@@ -45,6 +46,7 @@ void ResourceLoader::add_request(const ResourceRequest& rr)
 {
 	ScopedMutex sm(_mutex);
 	queue::push_back(_requests, rr);
+	_requests_condition.signal();
 }
 
 void ResourceLoader::flush()
@@ -85,15 +87,14 @@ void ResourceLoader::register_fallback(StringId64 type, StringId64 name)
 
 s32 ResourceLoader::run()
 {
-	while (!_exit)
+	while (1)
 	{
 		_mutex.lock();
-		if (queue::empty(_requests))
-		{
-			_mutex.unlock();
-			os::sleep(16);
-			continue;
-		}
+		while (queue::empty(_requests) && !_exit)
+			_requests_condition.wait(_mutex);
+
+		if (_exit)
+			break;
 
 		ResourceRequest rr = queue::front(_requests);
 		_mutex.unlock();
@@ -146,6 +147,7 @@ s32 ResourceLoader::run()
 		_mutex.unlock();
 	}
 
+	_mutex.unlock();
 	return 0;
 }
 

+ 2 - 0
src/resource/resource_loader.h

@@ -8,6 +8,7 @@
 #include "core/containers/types.h"
 #include "core/filesystem/types.h"
 #include "core/strings/string_id.h"
+#include "core/thread/condition_variable.h"
 #include "core/thread/mutex.h"
 #include "core/thread/thread.h"
 #include "core/types.h"
@@ -39,6 +40,7 @@ struct ResourceLoader
 
 	Thread _thread;
 	Mutex _mutex;
+	ConditionVariable _requests_condition;
 	Mutex _loaded_mutex;
 	bool _exit;