reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/task.hpp | 17+++++++++++++++++
Msrc/transaction.cpp | 6+++---
Msrc/transaction.hpp | 6++----
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;