QmlDesigner: More tracers

Task-number: QDS-11952
Change-Id: I9dc7325b73f85ed2e401689d255acd0ef68b094c
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
Marco Bubke
2024-02-15 13:28:37 +01:00
parent 5e4c1ba5a0
commit 3586a5b459
5 changed files with 66 additions and 3 deletions

View File

@@ -749,6 +749,12 @@ public:
return {}; return {};
} }
template<typename... Arguments>
[[nodiscard]] AsynchronousToken begin(const FlowTokenType &, ArgumentType, Arguments &&...)
{
return {};
}
template<typename... Arguments> template<typename... Arguments>
[[nodiscard]] std::pair<AsynchronousToken, FlowTokenType> beginWithFlow(ArgumentType, [[nodiscard]] std::pair<AsynchronousToken, FlowTokenType> beginWithFlow(ArgumentType,
Arguments &&...) Arguments &&...)
@@ -844,6 +850,22 @@ public:
return AsynchronousToken{std::move(name), m_id, m_category}; return AsynchronousToken{std::move(name), m_id, m_category};
} }
template<typename... Arguments>
[[nodiscard]] AsynchronousToken begin(const FlowTokenType &flowToken,
ArgumentType name,
Arguments &&...arguments)
{
if (m_id)
m_category().begin('b',
m_id,
name,
flowToken.bindId(),
IsFlow::In,
std::forward<Arguments>(arguments)...);
return AsynchronousToken{std::move(name), m_id, m_category};
}
template<typename... Arguments> template<typename... Arguments>
[[nodiscard]] std::pair<AsynchronousToken, FlowTokenType> beginWithFlow(ArgumentType name, [[nodiscard]] std::pair<AsynchronousToken, FlowTokenType> beginWithFlow(ArgumentType name,
Arguments &&...arguments) Arguments &&...arguments)

View File

@@ -25,6 +25,9 @@
namespace QmlDesigner { namespace QmlDesigner {
using namespace NanotraceHR::Literals;
using NanotraceHR::keyValue;
/*! /*!
\class QmlDesigner::AbstractView \class QmlDesigner::AbstractView
\ingroup CoreModel \ingroup CoreModel

View File

@@ -64,6 +64,8 @@ const QList<InternalNode::Pointer> &InternalNodeListProperty::nodeList() const
void InternalNodeListProperty::slide(int from, int to) void InternalNodeListProperty::slide(int from, int to)
{ {
traceToken.tick("slide"_t, keyValue("from", from), keyValue("to", to));
InternalNode::Pointer internalNode = m_nodeList.takeAt(from); InternalNode::Pointer internalNode = m_nodeList.takeAt(from);
m_nodeList.insert(to, internalNode); m_nodeList.insert(to, internalNode);
} }

View File

@@ -64,6 +64,9 @@ Components that want to be informed about changes in the model can register a su
*/ */
namespace QmlDesigner { namespace QmlDesigner {
using NanotraceHR::keyValue;
namespace Internal { namespace Internal {
ModelPrivate::ModelPrivate(Model *model, ModelPrivate::ModelPrivate(Model *model,
@@ -143,6 +146,8 @@ ModelPrivate::~ModelPrivate()
void ModelPrivate::detachAllViews() void ModelPrivate::detachAllViews()
{ {
auto tracer = traceToken.begin("detach all views"_t);
for (const QPointer<AbstractView> &view : std::as_const(m_viewList)) for (const QPointer<AbstractView> &view : std::as_const(m_viewList))
detachView(view.data(), true); detachView(view.data(), true);
@@ -176,6 +181,8 @@ Storage::Imports createStorageImports(const Imports &imports,
void ModelPrivate::changeImports(Imports toBeAddedImports, Imports toBeRemovedImports) void ModelPrivate::changeImports(Imports toBeAddedImports, Imports toBeRemovedImports)
{ {
auto tracer = traceToken.begin("change imports"_t);
std::sort(toBeAddedImports.begin(), toBeAddedImports.end()); std::sort(toBeAddedImports.begin(), toBeAddedImports.end());
std::sort(toBeRemovedImports.begin(), toBeRemovedImports.end()); std::sort(toBeRemovedImports.begin(), toBeRemovedImports.end());
@@ -251,6 +258,8 @@ void ModelPrivate::setDocumentMessages(const QList<DocumentMessage> &errors,
void ModelPrivate::setFileUrl(const QUrl &fileUrl) void ModelPrivate::setFileUrl(const QUrl &fileUrl)
{ {
auto tracer = traceToken.begin("file url"_t);
QUrl oldPath = m_fileUrl; QUrl oldPath = m_fileUrl;
if (oldPath != fileUrl) { if (oldPath != fileUrl) {
@@ -299,7 +308,7 @@ InternalNodePointer ModelPrivate::createNode(const TypeName &typeName,
majorVersion, majorVersion,
minorVersion, minorVersion,
internalId, internalId,
m_traceToken.tickWithFlow("create node"_t)); traceToken.tickWithFlow("create node"_t));
setTypeId(newNode.get(), typeName); setTypeId(newNode.get(), typeName);
@@ -1095,6 +1104,8 @@ void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListProperty *intern
void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList) void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList)
{ {
auto tracer = traceToken.begin("selected model nodes"_t);
auto sortedSelectedList = Utils::filtered(selectedNodeList, [](const auto &node) { auto sortedSelectedList = Utils::filtered(selectedNodeList, [](const auto &node) {
return node && node->isValid; return node && node->isValid;
}); });
@@ -1106,6 +1117,11 @@ void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNo
if (sortedSelectedList == m_selectedInternalNodeList) if (sortedSelectedList == m_selectedInternalNodeList)
return; return;
for (auto &node : sortedSelectedList) {
auto flowToken = node->traceToken.tickWithFlow("select model nodes"_t);
traceToken.tick(flowToken, "select model node"_t);
}
const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList; const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList;
m_selectedInternalNodeList = sortedSelectedList; m_selectedInternalNodeList = sortedSelectedList;
@@ -1114,6 +1130,8 @@ void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNo
void ModelPrivate::clearSelectedNodes() void ModelPrivate::clearSelectedNodes()
{ {
auto tracer = traceToken.begin("clear selected model nodes"_t);
const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList; const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList;
m_selectedInternalNodeList.clear(); m_selectedInternalNodeList.clear();
changeSelectedNodes(m_selectedInternalNodeList, lastSelectedNodeList); changeSelectedNodes(m_selectedInternalNodeList, lastSelectedNodeList);
@@ -1490,6 +1508,8 @@ void ModelPrivate::changeRootNodeType(const TypeName &type, int majorVersion, in
{ {
Q_ASSERT(rootNode()); Q_ASSERT(rootNode());
m_rootInternalNode->traceToken.tick("type name"_t, keyValue("type name", type));
m_rootInternalNode->typeName = type; m_rootInternalNode->typeName = type;
m_rootInternalNode->majorVersion = majorVersion; m_rootInternalNode->majorVersion = majorVersion;
m_rootInternalNode->minorVersion = minorVersion; m_rootInternalNode->minorVersion = minorVersion;
@@ -1499,6 +1519,8 @@ void ModelPrivate::changeRootNodeType(const TypeName &type, int majorVersion, in
void ModelPrivate::setScriptFunctions(const InternalNodePointer &node, const QStringList &scriptFunctionList) void ModelPrivate::setScriptFunctions(const InternalNodePointer &node, const QStringList &scriptFunctionList)
{ {
m_rootInternalNode->traceToken.tick("script function"_t);
node->scriptFunctions = scriptFunctionList; node->scriptFunctions = scriptFunctionList;
notifyScriptFunctionsChanged(node, scriptFunctionList); notifyScriptFunctionsChanged(node, scriptFunctionList);
@@ -1506,6 +1528,8 @@ void ModelPrivate::setScriptFunctions(const InternalNodePointer &node, const QSt
void ModelPrivate::setNodeSource(const InternalNodePointer &node, const QString &nodeSource) void ModelPrivate::setNodeSource(const InternalNodePointer &node, const QString &nodeSource)
{ {
m_rootInternalNode->traceToken.tick("node source"_t);
node->nodeSource = nodeSource; node->nodeSource = nodeSource;
notifyNodeSourceChanged(node, nodeSource); notifyNodeSourceChanged(node, nodeSource);
} }
@@ -1721,6 +1745,8 @@ void Model::changeImports(Imports importsToBeAdded, Imports importsToBeRemoved)
void Model::setPossibleImports(Imports possibleImports) void Model::setPossibleImports(Imports possibleImports)
{ {
auto tracer = d->traceToken.begin("possible imports"_t);
std::sort(possibleImports.begin(), possibleImports.end()); std::sort(possibleImports.begin(), possibleImports.end());
if (d->m_possibleImportList != possibleImports) { if (d->m_possibleImportList != possibleImports) {
@@ -1731,6 +1757,8 @@ void Model::setPossibleImports(Imports possibleImports)
void Model::setUsedImports(Imports usedImports) void Model::setUsedImports(Imports usedImports)
{ {
auto tracer = d->traceToken.begin("used imports"_t);
std::sort(usedImports.begin(), usedImports.end()); std::sort(usedImports.begin(), usedImports.end());
if (d->m_usedImportList != usedImports) { if (d->m_usedImportList != usedImports) {
@@ -2594,6 +2622,10 @@ The view is informed that it has been registered within the model by a call to A
*/ */
void Model::attachView(AbstractView *view) void Model::attachView(AbstractView *view)
{ {
auto traceToken = d->traceToken.begin("attachView"_t,
keyValue("name",
std::string_view{view->metaObject()->className()}));
// Internal::WriteLocker locker(d); // Internal::WriteLocker locker(d);
auto castedRewriterView = qobject_cast<RewriterView *>(view); auto castedRewriterView = qobject_cast<RewriterView *>(view);
if (castedRewriterView) { if (castedRewriterView) {
@@ -2621,6 +2653,10 @@ void Model::attachView(AbstractView *view)
*/ */
void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify) void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify)
{ {
auto traceToken = d->traceToken.begin("detachView"_t,
keyValue("name",
std::string_view{view->metaObject()->className()}));
// Internal::WriteLocker locker(d); // Internal::WriteLocker locker(d);
bool emitNotify = (emitDetachNotify == NotifyView); bool emitNotify = (emitDetachNotify == NotifyView);

View File

@@ -333,6 +333,7 @@ private:
public: public:
NotNullPointer<ProjectStorageType> projectStorage = nullptr; NotNullPointer<ProjectStorageType> projectStorage = nullptr;
NotNullPointer<PathCacheType> pathCache = nullptr; NotNullPointer<PathCacheType> pathCache = nullptr;
ModelTracing::AsynchronousToken traceToken = ModelTracing::category().beginAsynchronous("Model"_t);
private: private:
Model *m_model = nullptr; Model *m_model = nullptr;
@@ -357,8 +358,7 @@ private:
QPointer<NodeInstanceView> m_nodeInstanceView; QPointer<NodeInstanceView> m_nodeInstanceView;
QPointer<Model> m_metaInfoProxyModel; QPointer<Model> m_metaInfoProxyModel;
QHash<TypeName, std::shared_ptr<NodeMetaInfoPrivate>> m_nodeMetaInfoCache; QHash<TypeName, std::shared_ptr<NodeMetaInfoPrivate>> m_nodeMetaInfoCache;
ModelTracing::AsynchronousToken m_traceToken = ModelTracing::category().beginAsynchronous(
"Model"_t);
bool m_writeLock = false; bool m_writeLock = false;
qint32 m_internalIdCounter = 1; qint32 m_internalIdCounter = 1;
}; };