summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-01 06:05:45 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2021-07-09 00:03:26 +0200
commitbf5b5c1bf43946039d91f78253599c9996f86057 (patch)
tree2fcfd8f48297b03e3a9eb03cfe7594c7ead4edaa /src/common
parentcommon: Add unique function (diff)
downloadyuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar.gz
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar.bz2
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar.lz
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar.xz
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.tar.zst
yuzu-bf5b5c1bf43946039d91f78253599c9996f86057.zip
Diffstat (limited to 'src/common')
-rw-r--r--src/common/thread_worker.cpp46
-rw-r--r--src/common/thread_worker.h6
2 files changed, 24 insertions, 28 deletions
diff --git a/src/common/thread_worker.cpp b/src/common/thread_worker.cpp
index 745918c7e..f4d8bb0f0 100644
--- a/src/common/thread_worker.cpp
+++ b/src/common/thread_worker.cpp
@@ -8,36 +8,30 @@
namespace Common {
ThreadWorker::ThreadWorker(std::size_t num_workers, const std::string& name) {
- for (std::size_t i = 0; i < num_workers; ++i)
- threads.emplace_back([this, thread_name{std::string{name}}] {
- Common::SetCurrentThreadName(thread_name.c_str());
+ const auto lambda = [this, thread_name{std::string{name}}] {
+ Common::SetCurrentThreadName(thread_name.c_str());
- // Wait for first request
+ while (!stop) {
+ UniqueFunction<void> task;
{
std::unique_lock lock{queue_mutex};
+ if (requests.empty()) {
+ wait_condition.notify_all();
+ }
condition.wait(lock, [this] { return stop || !requests.empty(); });
- }
-
- while (true) {
- std::function<void()> task;
-
- {
- std::unique_lock lock{queue_mutex};
- condition.wait(lock, [this] { return stop || !requests.empty(); });
- if (stop || requests.empty()) {
- return;
- }
- task = std::move(requests.front());
- requests.pop();
-
- if (requests.empty()) {
- wait_condition.notify_one();
- }
+ if (stop || requests.empty()) {
+ break;
}
-
- task();
+ task = std::move(requests.front());
+ requests.pop();
}
- });
+ task();
+ }
+ wait_condition.notify_all();
+ };
+ for (size_t i = 0; i < num_workers; ++i) {
+ threads.emplace_back(lambda);
+ }
}
ThreadWorker::~ThreadWorker() {
@@ -51,10 +45,10 @@ ThreadWorker::~ThreadWorker() {
}
}
-void ThreadWorker::QueueWork(std::function<void()>&& work) {
+void ThreadWorker::QueueWork(UniqueFunction<void> work) {
{
std::unique_lock lock{queue_mutex};
- requests.emplace(work);
+ requests.emplace(std::move(work));
}
condition.notify_one();
}
diff --git a/src/common/thread_worker.h b/src/common/thread_worker.h
index 7a6756eb5..7e2b04a07 100644
--- a/src/common/thread_worker.h
+++ b/src/common/thread_worker.h
@@ -11,18 +11,20 @@
#include <vector>
#include <queue>
+#include "common/unique_function.h"
+
namespace Common {
class ThreadWorker final {
public:
explicit ThreadWorker(std::size_t num_workers, const std::string& name);
~ThreadWorker();
- void QueueWork(std::function<void()>&& work);
+ void QueueWork(UniqueFunction<void> work);
void WaitForRequests();
private:
std::vector<std::thread> threads;
- std::queue<std::function<void()>> requests;
+ std::queue<UniqueFunction<void>> requests;
std::mutex queue_mutex;
std::condition_variable condition;
std::condition_variable wait_condition;