summary refs log tree commit diff
path: root/src/Compute/Queue.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compute/Queue.hpp')
-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;