aboutsummaryrefslogtreecommitdiff
path: root/launcher/tasks
diff options
context:
space:
mode:
authorSefa Eyeoglu <contact@scrumplex.net>2023-01-24 14:37:40 +0100
committerSefa Eyeoglu <contact@scrumplex.net>2023-01-24 14:40:17 +0100
commit6e841a3b7e5f9270b730a10d991433f37678818a (patch)
tree0b4f0a6c44b0464bb3eb1d44d94e90b1805fb262 /launcher/tasks
parent849b92665e0762a38a7e17403015e2b037318aec (diff)
parent16477a8f6c1fc646208b41b76598ce8e7a60369e (diff)
downloadPrismLauncher-6e841a3b7e5f9270b730a10d991433f37678818a.tar.gz
PrismLauncher-6e841a3b7e5f9270b730a10d991433f37678818a.tar.bz2
PrismLauncher-6e841a3b7e5f9270b730a10d991433f37678818a.zip
Merge branch 'develop' into remove-updater
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
Diffstat (limited to 'launcher/tasks')
-rw-r--r--launcher/tasks/ConcurrentTask.cpp34
-rw-r--r--launcher/tasks/ConcurrentTask.h9
-rw-r--r--launcher/tasks/MultipleOptionsTask.cpp4
-rw-r--r--launcher/tasks/SequentialTask.cpp4
4 files changed, 36 insertions, 15 deletions
diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp
index ce08a6a2..190d48d8 100644
--- a/launcher/tasks/ConcurrentTask.cpp
+++ b/launcher/tasks/ConcurrentTask.cpp
@@ -27,18 +27,13 @@ auto ConcurrentTask::getStepTotalProgress() const -> qint64
void ConcurrentTask::addTask(Task::Ptr task)
{
- if (!isRunning())
- m_queue.append(task);
- else
- qWarning() << "Tried to add a task to a running concurrent task!";
+ m_queue.append(task);
}
void ConcurrentTask::executeTask()
{
- m_total_size = m_queue.size();
-
// Start the least amount of tasks needed, but at least one
- int num_starts = std::max(1, std::min(m_total_max_size, m_total_size));
+ int num_starts = qMax(1, qMin(m_total_max_size, m_queue.size()));
for (int i = 0; i < num_starts; i++) {
QMetaObject::invokeMethod(this, &ConcurrentTask::startNext, Qt::QueuedConnection);
}
@@ -73,6 +68,20 @@ bool ConcurrentTask::abort()
return suceedeed;
}
+void ConcurrentTask::clear()
+{
+ Q_ASSERT(!isRunning());
+
+ m_done.clear();
+ m_failed.clear();
+ m_queue.clear();
+
+ m_aborted = false;
+
+ m_progress = 0;
+ m_stepProgress = 0;
+}
+
void ConcurrentTask::startNext()
{
if (m_aborted || m_doing.count() > m_total_max_size)
@@ -103,7 +112,12 @@ void ConcurrentTask::startNext()
QCoreApplication::processEvents();
- next->start();
+ QMetaObject::invokeMethod(next.get(), &Task::start, Qt::QueuedConnection);
+
+ // Allow going up the number of concurrent tasks in case of tasks being added in the middle of a running task.
+ int num_starts = m_total_max_size - m_doing.size();
+ for (int i = 0; i < num_starts; i++)
+ QMetaObject::invokeMethod(this, &ConcurrentTask::startNext, Qt::QueuedConnection);
}
void ConcurrentTask::subTaskSucceeded(Task::Ptr task)
@@ -145,7 +159,7 @@ void ConcurrentTask::subTaskProgress(qint64 current, qint64 total)
void ConcurrentTask::updateState()
{
- setProgress(m_done.count(), m_total_size);
+ setProgress(m_done.count(), totalSize());
setStatus(tr("Executing %1 task(s) (%2 out of %3 are done)")
- .arg(QString::number(m_doing.count()), QString::number(m_done.count()), QString::number(m_total_size)));
+ .arg(QString::number(m_doing.count()), QString::number(m_done.count()), QString::number(totalSize())));
}
diff --git a/launcher/tasks/ConcurrentTask.h b/launcher/tasks/ConcurrentTask.h
index f1279d32..b46919fb 100644
--- a/launcher/tasks/ConcurrentTask.h
+++ b/launcher/tasks/ConcurrentTask.h
@@ -24,6 +24,11 @@ public:
public slots:
bool abort() override;
+ /** Resets the internal state of the task.
+ * This allows the same task to be re-used.
+ */
+ void clear();
+
protected
slots:
void executeTask() override;
@@ -36,6 +41,9 @@ slots:
void subTaskProgress(qint64 current, qint64 total);
protected:
+ // NOTE: This is not thread-safe.
+ [[nodiscard]] unsigned int totalSize() const { return m_queue.size() + m_doing.size() + m_done.size(); }
+
void setStepStatus(QString status) { m_step_status = status; emit stepStatus(status); };
virtual void updateState();
@@ -51,7 +59,6 @@ protected:
QHash<Task*, Task::Ptr> m_failed;
int m_total_max_size;
- int m_total_size;
qint64 m_stepProgress = 0;
qint64 m_stepTotalProgress = 100;
diff --git a/launcher/tasks/MultipleOptionsTask.cpp b/launcher/tasks/MultipleOptionsTask.cpp
index 5ad6181f..034499df 100644
--- a/launcher/tasks/MultipleOptionsTask.cpp
+++ b/launcher/tasks/MultipleOptionsTask.cpp
@@ -22,6 +22,6 @@ void MultipleOptionsTask::startNext()
void MultipleOptionsTask::updateState()
{
- setProgress(m_done.count(), m_total_size);
- setStatus(tr("Attempting task %1 out of %2").arg(QString::number(m_doing.count() + m_done.count()), QString::number(m_total_size)));
+ setProgress(m_done.count(), totalSize());
+ setStatus(tr("Attempting task %1 out of %2").arg(QString::number(m_doing.count() + m_done.count()), QString::number(totalSize())));
}
diff --git a/launcher/tasks/SequentialTask.cpp b/launcher/tasks/SequentialTask.cpp
index a34137cb..b2f86328 100644
--- a/launcher/tasks/SequentialTask.cpp
+++ b/launcher/tasks/SequentialTask.cpp
@@ -17,6 +17,6 @@ void SequentialTask::startNext()
void SequentialTask::updateState()
{
- setProgress(m_done.count(), m_total_size);
- setStatus(tr("Executing task %1 out of %2").arg(QString::number(m_doing.count() + m_done.count()), QString::number(m_total_size)));
+ setProgress(m_done.count(), totalSize());
+ setStatus(tr("Executing task %1 out of %2").arg(QString::number(m_doing.count() + m_done.count()), QString::number(totalSize())));
}