commit 263262b02f75d13d7ed94cd4775426d37ba32422
parent 09bf0d57a138aa63c3ea023b8fd41a2078b8ba5f
Author: cfillion <cfillion@users.noreply.github.com>
Date: Tue, 23 Aug 2016 23:29:27 -0400
transaction: process uninstallation tasks before any other task
Diffstat:
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/src/task.hpp b/src/task.hpp
@@ -21,6 +21,7 @@
#include "path.hpp"
#include "registry.hpp"
+#include <queue>
#include <set>
#include <vector>
@@ -41,7 +42,10 @@ public:
virtual void commit() = 0;
virtual void rollback() {}
+ bool operator<(const Task &o) { return priority() < o.priority(); }
+
protected:
+ virtual int priority() const { return 0; }
Transaction *tx() const { return m_tx; }
private:
@@ -74,6 +78,7 @@ public:
UninstallTask(const Registry::Entry &, Transaction *);
protected:
+ int priority() const override { return 1; }
bool start() override;
void commit() override;
@@ -95,4 +100,16 @@ private:
bool m_pin;
};
+typedef std::shared_ptr<Task> TaskPtr;
+
+class CompareTaskPtr {
+public:
+ bool operator()(const TaskPtr &l, const TaskPtr &r) const
+ {
+ return *l < *r;
+ }
+};
+
+typedef std::priority_queue<TaskPtr, std::vector<TaskPtr>, CompareTaskPtr> TaskQueue;
+
#endif
diff --git a/src/transaction.cpp b/src/transaction.cpp
@@ -179,7 +179,7 @@ bool Transaction::runTasks()
{
if(!m_currentQueue.empty()) {
m_taskQueues.push(m_currentQueue);
- queue<TaskPtr>().swap(m_currentQueue);
+ TaskQueue().swap(m_currentQueue);
}
// do nothing if there are running tasks
@@ -189,10 +189,10 @@ bool Transaction::runTasks()
while(!m_taskQueues.empty()) {
m_registry.savepoint();
- TaskQueue &queue = m_taskQueues.front();
+ auto &queue = m_taskQueues.front();
while(!queue.empty()) {
- const TaskPtr &task = queue.front();
+ const TaskPtr &task = queue.top();
if(task->start())
m_runningTasks.push(task);
diff --git a/src/transaction.hpp b/src/transaction.hpp
@@ -21,6 +21,7 @@
#include "download.hpp"
#include "receipt.hpp"
#include "registry.hpp"
+#include "task.hpp"
#include <boost/optional.hpp>
#include <boost/signals2.hpp>
@@ -35,9 +36,6 @@ class Remote;
class Task;
struct InstallOpts;
-typedef std::shared_ptr<Task> TaskPtr;
-typedef std::queue<TaskPtr> TaskQueue;
-
struct HostTicket { bool add; Registry::Entry entry; Registry::File file; };
class Transaction {
@@ -90,8 +88,8 @@ private:
DownloadQueue m_downloadQueue;
TaskQueue m_currentQueue;
- TaskQueue m_runningTasks;
std::queue<TaskQueue> m_taskQueues;
+ std::queue<TaskPtr> m_runningTasks;
std::queue<HostTicket> m_regQueue;
VoidSignal m_onFinish;