diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2014-08-05 11:04:37 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2014-08-07 11:04:47 +0200 |
commit | 8bf4a5b089a26474099f576e285026b7dcc47a7b (patch) | |
tree | c17bb21f1db6a88f1de4251166dba6b3a4d7ddc0 /src/plugins/cpptools/builtinindexingsupport.cpp | |
parent | 70ca7496e3eea7ccfce690be72693a85fac1276e (diff) | |
download | qt-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.cpp | 43 |
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(); |