summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/builtinindexingsupport.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-08-05 11:04:37 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2014-08-07 11:04:47 +0200
commit8bf4a5b089a26474099f576e285026b7dcc47a7b (patch)
treec17bb21f1db6a88f1de4251166dba6b3a4d7ddc0 /src/plugins/cpptools/builtinindexingsupport.cpp
parent70ca7496e3eea7ccfce690be72693a85fac1276e (diff)
downloadqt-creator-8bf4a5b089a26474099f576e285026b7dcc47a7b.tar.gz
CppTools: Builtin-Indexer: Fix potential memory leak
In case the list of source files to be parsed is empty, the CppSourceProcessor is never deleted. This was never a real problem because of the guard in CppModelManager::updateSourceFiles(). Change-Id: Icfd6962d11f2b2bf2ac28825f2fa0af0838a09c8 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/builtinindexingsupport.cpp')
-rw-r--r--src/plugins/cpptools/builtinindexingsupport.cpp43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp
index 3135a23300..ad0d1f4211 100644
--- a/src/plugins/cpptools/builtinindexingsupport.cpp
+++ b/src/plugins/cpptools/builtinindexingsupport.cpp
@@ -21,13 +21,33 @@ static const bool DumpFileNameWhileParsing = qgetenv("QTC_DUMP_FILENAME_WHILE_PA
namespace {
-static void parse(QFutureInterface<void> &future,
- CppSourceProcessor *sourceProcessor,
- QStringList files)
+class ParseParams
{
- if (files.isEmpty())
+public:
+ ParseParams()
+ : dumpFileNameWhileParsing(DumpFileNameWhileParsing)
+ , revision(0)
+ {}
+
+ int dumpFileNameWhileParsing;
+ int revision;
+ ProjectPart::HeaderPaths headerPaths;
+ CppModelManagerInterface::WorkingCopy workingCopy;
+ QStringList sourceFiles;
+};
+
+static void parse(QFutureInterface<void> &future, const ParseParams params)
+{
+ if (params.sourceFiles.isEmpty())
return;
+ QScopedPointer<CppSourceProcessor> sourceProcessor(CppModelManager::createSourceProcessor());
+ sourceProcessor->setDumpFileNameWhileParsing(params.dumpFileNameWhileParsing);
+ sourceProcessor->setRevision(params.revision);
+ sourceProcessor->setHeaderPaths(params.headerPaths);
+ sourceProcessor->setWorkingCopy(params.workingCopy);
+
+ QStringList files = params.sourceFiles;
QStringList sources;
QStringList headers;
@@ -85,8 +105,6 @@ static void parse(QFutureInterface<void> &future,
future.setProgressValue(files.size());
cmm->finishedRefreshingSourceFiles(files);
-
- delete sourceProcessor;
}
class BuiltinSymbolSearcher: public SymbolSearcher
@@ -184,15 +202,14 @@ QFuture<void> BuiltinIndexingSupport::refreshSourceFiles(const QStringList &sour
CppModelManagerInterface::ProgressNotificationMode mode)
{
CppModelManager *mgr = CppModelManager::instance();
- const WorkingCopy workingCopy = mgr->workingCopy();
- CppSourceProcessor *preproc = CppModelManager::createSourceProcessor();
- preproc->setDumpFileNameWhileParsing(DumpFileNameWhileParsing);
- preproc->setRevision(++m_revision);
- preproc->setHeaderPaths(mgr->headerPaths());
- preproc->setWorkingCopy(workingCopy);
+ ParseParams params;
+ params.revision = ++m_revision;
+ params.headerPaths = mgr->headerPaths();
+ params.workingCopy = mgr->workingCopy();
+ params.sourceFiles = sourceFiles;
- QFuture<void> result = QtConcurrent::run(&parse, preproc, sourceFiles);
+ QFuture<void> result = QtConcurrent::run(&parse, params);
if (m_synchronizer.futures().size() > 10) {
QList<QFuture<void> > futures = m_synchronizer.futures();