summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppelementevaluator.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2020-12-08 09:27:38 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2020-12-10 12:44:49 +0000
commit82b2735da40a8146100307afe628e775d96afcc2 (patch)
tree8f140e9aaa48799283e2861374efa79898efca75 /src/plugins/cpptools/cppelementevaluator.cpp
parentf440dfe43a286ef1d84d4fe1e281ea8996e64148 (diff)
downloadqt-creator-82b2735da40a8146100307afe628e775d96afcc2.tar.gz
Don't leak memory when canceling Type Hierarchy
Add QFutureSynchronizer for collecting all running futures (including those already canceled, but not finished yet). It could happen, that we cancel the future, while the associated task still needs some time in order to catch the cancel request. When a d'tor of synchronizer is run it cancels and waits for all pending futures to be finished. Add extra check for isCanceled() after a call to updateDependencyTable(). In case the cancel was detected inside updateDependencyTable(), we should return immediately. Don't leak CppClass object inside handleLookupItemMatch() when the task was canceled. Amends: c400923308f5c4df4e8d96a04d12dc54322f7ade Change-Id: I709e14a0c8b563d522a8e8c32b087e5f83310b24 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/plugins/cpptools/cppelementevaluator.cpp')
-rw-r--r--src/plugins/cpptools/cppelementevaluator.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp
index 208f75433d..0e739ddeab 100644
--- a/src/plugins/cpptools/cppelementevaluator.cpp
+++ b/src/plugins/cpptools/cppelementevaluator.cpp
@@ -214,6 +214,8 @@ void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface,
using Data = QPair<CppClass*, CppTools::TypeHierarchy>;
snapshot.updateDependencyTable(futureInterface);
+ if (futureInterface.isCanceled())
+ return;
CppTools::TypeHierarchyBuilder builder(declaration, snapshot);
const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(futureInterface);
@@ -531,7 +533,7 @@ static void handleLookupItemMatch(QFutureInterface<QSharedPointer<CppElement>> &
if (futureInterface.isCanceled())
return;
- auto cppClass = new CppClass(declaration);
+ QSharedPointer<CppClass> cppClass(new CppClass(declaration));
if (lookupBaseClasses)
cppClass->lookupBases(futureInterface, declaration, contextToUse);
if (futureInterface.isCanceled())
@@ -540,7 +542,7 @@ static void handleLookupItemMatch(QFutureInterface<QSharedPointer<CppElement>> &
cppClass->lookupDerived(futureInterface, declaration, snapshot);
if (futureInterface.isCanceled())
return;
- element = QSharedPointer<CppElement>(cppClass);
+ element = cppClass;
} else if (Enum *enumDecl = declaration->asEnum()) {
element = QSharedPointer<CppElement>(new CppEnum(enumDecl));
} else if (auto enumerator = dynamic_cast<EnumeratorDeclaration *>(declaration)) {