summaryrefslogtreecommitdiff
path: root/src/Compute
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compute')
-rw-r--r--src/Compute/Queue.hpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/Compute/Queue.hpp b/src/Compute/Queue.hpp
index 6aba1ab..53acc2d 100644
--- a/src/Compute/Queue.hpp
+++ b/src/Compute/Queue.hpp
@@ -5,7 +5,7 @@
#include <mutex>
#include <utility>
#include <vector>
-#include <iostream>
+#include <queue>
#include <thread>
namespace MC::Compute {
@@ -20,9 +20,9 @@ public:
}
};
- void add(I id, std::function<X()> execute) {
+ void add(I id, float priority, std::function<X()> execute) {
std::scoped_lock work_lock(m_control->work.mutex);
- m_control->work.jobs.push_back({id, std::move(execute)});
+ m_control->work.jobs.emplace(id, priority, execute);
}
struct Result {
@@ -43,13 +43,19 @@ public:
private:
struct Job {
+ Job() = default;
+ Job(I id, float priority, std::function<X()> execute) : id(id), priority(priority), execute(execute) {}
+
I id;
+ float priority;
std::function<X()> execute;
+
+ bool operator>(const Job& other) const { return priority > other.priority; }
};
struct Work {
std::mutex mutex;
- std::vector<Job> jobs;
+ std::priority_queue<Job, std::vector<Job>, std::greater<Job>> jobs;
};
struct Results {
@@ -71,8 +77,8 @@ private:
{
std::scoped_lock work_lock(control->work.mutex);
if (!control->work.jobs.empty()) {
- job = control->work.jobs.back();
- control->work.jobs.pop_back();
+ job = control->work.jobs.top();
+ control->work.jobs.pop();
nothing_to_do = false;
}
}