TaskTree: Create more data on stack

Use std::optional instead of std::unique_ptr.

Change-Id: I5b182a10ebbd47c02de113c8d317ad531d603661
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2023-11-12 15:26:28 +01:00
parent be1c072157
commit 2a1abb4143

View File

@@ -1071,6 +1071,47 @@ private:
QList<TreeStorageBase> m_activeStorages; QList<TreeStorageBase> m_activeStorages;
}; };
class TaskContainer
{
Q_DISABLE_COPY(TaskContainer)
public:
TaskContainer(TaskContainer &&other) = default;
TaskContainer(TaskTreePrivate *taskTreePrivate, const GroupItem &task,
TaskNode *parentNode, TaskContainer *parentContainer);
TaskTreePrivate *const m_taskTreePrivate = nullptr;
TaskNode *const m_parentNode = nullptr;
TaskContainer *const m_parentContainer = nullptr;
const int m_parallelLimit = 1;
const WorkflowPolicy m_workflowPolicy = WorkflowPolicy::StopOnError;
const GroupItem::GroupHandler m_groupHandler;
const QList<TreeStorageBase> m_storageList;
std::vector<TaskNode> m_children;
const int m_taskCount = 0;
};
class TaskNode
{
Q_DISABLE_COPY(TaskNode)
public:
TaskNode(TaskNode &&other) = default;
TaskNode(TaskTreePrivate *taskTreePrivate, const GroupItem &task,
TaskContainer *parentContainer)
: m_taskHandler(task.m_taskHandler)
, m_container(taskTreePrivate, task, this, parentContainer)
{}
bool isTask() const { return bool(m_taskHandler.m_createHandler); }
int taskCount() const { return isTask() ? 1 : m_container.m_taskCount; }
TaskContainer *parentContainer() const { return m_container.m_parentContainer; }
const GroupItem::TaskHandler m_taskHandler;
TaskContainer m_container;
};
class TaskTreePrivate class TaskTreePrivate
{ {
Q_DISABLE_COPY_MOVE(TaskTreePrivate) Q_DISABLE_COPY_MOVE(TaskTreePrivate)
@@ -1143,49 +1184,8 @@ public:
int m_progressValue = 0; int m_progressValue = 0;
QSet<TreeStorageBase> m_storages; QSet<TreeStorageBase> m_storages;
QHash<TreeStorageBase, StorageHandler> m_storageHandlers; QHash<TreeStorageBase, StorageHandler> m_storageHandlers;
std::unique_ptr<TaskNode> m_root = nullptr; // Keep me last in order to destruct first std::optional<TaskNode> m_root;
std::unique_ptr<TaskRuntimeNode> m_runtimeRoot = nullptr; std::unique_ptr<TaskRuntimeNode> m_runtimeRoot; // Keep me last in order to destruct first
};
class TaskContainer
{
Q_DISABLE_COPY(TaskContainer)
public:
TaskContainer(TaskContainer &&other) = default;
TaskContainer(TaskTreePrivate *taskTreePrivate, const GroupItem &task,
TaskNode *parentNode, TaskContainer *parentContainer);
TaskTreePrivate *const m_taskTreePrivate = nullptr;
TaskNode *const m_parentNode = nullptr;
TaskContainer *const m_parentContainer = nullptr;
const int m_parallelLimit = 1;
const WorkflowPolicy m_workflowPolicy = WorkflowPolicy::StopOnError;
const GroupItem::GroupHandler m_groupHandler;
const QList<TreeStorageBase> m_storageList;
std::vector<TaskNode> m_children;
const int m_taskCount = 0;
};
class TaskNode
{
Q_DISABLE_COPY(TaskNode)
public:
TaskNode(TaskNode &&other) = default;
TaskNode(TaskTreePrivate *taskTreePrivate, const GroupItem &task,
TaskContainer *parentContainer)
: m_taskHandler(task.m_taskHandler)
, m_container(taskTreePrivate, task, this, parentContainer)
{}
bool isTask() const { return bool(m_taskHandler.m_createHandler); }
int taskCount() const { return isTask() ? 1 : m_container.m_taskCount; }
TaskContainer *parentContainer() const { return m_container.m_parentContainer; }
const GroupItem::TaskHandler m_taskHandler;
TaskContainer m_container;
}; };
static bool initialSuccessBit(WorkflowPolicy workflowPolicy) static bool initialSuccessBit(WorkflowPolicy workflowPolicy)
@@ -1207,6 +1207,8 @@ static bool initialSuccessBit(WorkflowPolicy workflowPolicy)
class TaskRuntimeContainer class TaskRuntimeContainer
{ {
Q_DISABLE_COPY(TaskRuntimeContainer)
public: public:
TaskRuntimeContainer(const TaskContainer &taskContainer, TaskRuntimeNode *parentNode, TaskRuntimeContainer(const TaskContainer &taskContainer, TaskRuntimeNode *parentNode,
TaskRuntimeContainer *parentContainer) TaskRuntimeContainer *parentContainer)
@@ -1250,6 +1252,8 @@ public:
class TaskRuntimeNode class TaskRuntimeNode
{ {
Q_DISABLE_COPY(TaskRuntimeNode)
public: public:
TaskRuntimeNode(const TaskNode &taskNode, TaskRuntimeContainer *parentContainer) TaskRuntimeNode(const TaskNode &taskNode, TaskRuntimeContainer *parentContainer)
: m_taskNode(taskNode) : m_taskNode(taskNode)
@@ -1258,7 +1262,7 @@ public:
const TaskNode &m_taskNode; // Not owning. const TaskNode &m_taskNode; // Not owning.
TaskRuntimeContainer *m_parentContainer = nullptr; // Not owning. TaskRuntimeContainer *m_parentContainer = nullptr; // Not owning.
std::unique_ptr<TaskRuntimeContainer> m_container; // Owning. std::optional<TaskRuntimeContainer> m_container; // Owning.
std::unique_ptr<TaskInterface> m_task; // Owning. std::unique_ptr<TaskInterface> m_task; // Owning.
}; };
@@ -1290,7 +1294,7 @@ void TaskTreePrivate::start()
QT_ASSERT(m_storages.contains(it.key()), qWarning("The registered storage doesn't " QT_ASSERT(m_storages.contains(it.key()), qWarning("The registered storage doesn't "
"exist in task tree. Its handlers will never be called.")); "exist in task tree. Its handlers will never be called."));
} }
m_runtimeRoot.reset(new TaskRuntimeNode(*m_root.get(), nullptr)); m_runtimeRoot.reset(new TaskRuntimeNode(*m_root, nullptr));
start(m_runtimeRoot.get()); start(m_runtimeRoot.get());
} }
@@ -1538,9 +1542,8 @@ bool TaskTreePrivate::invokeDoneHandler(TaskRuntimeContainer *container, DoneWit
SetupResult TaskTreePrivate::start(TaskRuntimeNode *node) SetupResult TaskTreePrivate::start(TaskRuntimeNode *node)
{ {
if (!node->m_taskNode.isTask()) { if (!node->m_taskNode.isTask()) {
node->m_container.reset(new TaskRuntimeContainer(node->m_taskNode.m_container, node, node->m_container.emplace(node->m_taskNode.m_container, node, node->m_parentContainer);
node->m_parentContainer)); return start(&*node->m_container);
return start(node->m_container.get());
} }
const GroupItem::TaskHandler &handler = node->m_taskNode.m_taskHandler; const GroupItem::TaskHandler &handler = node->m_taskNode.m_taskHandler;
@@ -1578,9 +1581,9 @@ void TaskTreePrivate::stop(TaskRuntimeNode *node)
if (!node->m_task) { if (!node->m_task) {
if (!node->m_container) if (!node->m_container)
return; return;
stop(node->m_container.get()); stop(&*node->m_container);
node->m_container->updateSuccessBit(false); node->m_container->updateSuccessBit(false);
invokeDoneHandler(node->m_container.get(), DoneWith::Cancel); invokeDoneHandler(&*node->m_container, DoneWith::Cancel);
return; return;
} }
@@ -2299,7 +2302,7 @@ void TaskTree::setRecipe(const Group &recipe)
"TaskTree handlers, ignoring..."); return); "TaskTree handlers, ignoring..."); return);
// TODO: Should we clear the m_storageHandlers, too? // TODO: Should we clear the m_storageHandlers, too?
d->m_storages.clear(); d->m_storages.clear();
d->m_root.reset(new TaskNode(d, recipe, nullptr)); d->m_root.emplace(d, recipe, nullptr);
} }
/*! /*!