summaryrefslogtreecommitdiff
path: root/src/Compute
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compute')
-rw-r--r--src/Compute/Queue.hpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Compute/Queue.hpp b/src/Compute/Queue.hpp
index e201932..799df73 100644
--- a/src/Compute/Queue.hpp
+++ b/src/Compute/Queue.hpp
@@ -46,6 +46,37 @@ public:
return done_results;
}
+ struct Reassession {
+ enum { Keep, Reassess, Cancel } type;
+ Real new_priority = 0;
+ };
+
+ template <typename F>
+ void reassess(F assess) {
+ decltype(m_control->work.jobs) new_jobs{};
+
+ std::scoped_lock work_lock(m_control->work.mutex);
+ while (!m_control->work.jobs.empty()) { // I don't like std::priority_queue :(
+ Job job = m_control->work.jobs.top();
+ m_control->work.jobs.pop();
+
+ Reassession reassession = assess(job.id);
+
+ switch (reassession.type) {
+ case Reassession::Keep:
+ new_jobs.push(job);
+ break;
+ case Reassession::Reassess:
+ new_jobs.emplace(job.id, reassession.new_priority, job.execute);
+ break;
+ default:
+ break;
+ }
+ }
+
+ m_control->work.jobs = std::move(new_jobs);
+ }
+
private:
struct Job {
Job() = default;