TaskTree: Don't derive TaskNode from QObject

It reduces the time spent inside TaskTree::setupRoot()
by ~30% for big trees (~7000 tasks).

Change-Id: Ic65ed0fdf511977d9cc2fe22bdac814516e9883d
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2023-05-17 17:38:10 +02:00
parent 5ae82a88cf
commit c603e01535

View File

@@ -298,7 +298,7 @@ public:
std::optional<RuntimeData> m_runtimeData;
};
class TaskNode : public QObject
class TaskNode
{
public:
TaskNode(TaskTreePrivate *taskTreePrivate, const TaskItem &task,
@@ -316,6 +316,7 @@ public:
bool isTask() const { return bool(m_taskHandler.m_createHandler); }
int taskCount() const { return isTask() ? 1 : m_container.m_constData.m_taskCount; }
TaskContainer *parentContainer() const { return m_container.m_constData.m_parentContainer; }
TaskTree *taskTree() const { return m_container.m_constData.m_taskTreePrivate->q; }
private:
const TaskItem::TaskHandler m_taskHandler;
@@ -647,9 +648,9 @@ TaskAction TaskNode::start()
}
const std::shared_ptr<TaskAction> unwindAction
= std::make_shared<TaskAction>(TaskAction::Continue);
connect(m_task.get(), &TaskInterface::done, this, [=](bool success) {
QObject::connect(m_task.get(), &TaskInterface::done, taskTree(), [=](bool success) {
invokeEndHandler(success);
disconnect(m_task.get(), &TaskInterface::done, this, nullptr);
QObject::disconnect(m_task.get(), &TaskInterface::done, taskTree(), nullptr);
m_task.release()->deleteLater();
QTC_ASSERT(parentContainer() && parentContainer()->isRunning(), return);
if (parentContainer()->isStarting())