summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cpptoolseditorsupport.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-04-10 11:13:37 -0400
committerErik Verbruggen <erik.verbruggen@digia.com>2014-04-14 10:29:57 +0200
commit9b2672cb051506fa88c8432ba41911471866793a (patch)
treecb45df047444fadbf3c203ae38d042b3bb302bee /src/plugins/cpptools/cpptoolseditorsupport.cpp
parent291b80cb330f6f7a802ad9039c6e4294caee61b1 (diff)
downloadqt-creator-9b2672cb051506fa88c8432ba41911471866793a.tar.gz
CppTools: Fix data race when accessing the editor revision
Addresses the following findings of QTCREATORBUG-12030: * qtc.helgrind.plugintests.txt#2 * qtc.helgrind.usingEditors1.txt#1 Helgrind report (truncated): Possible data race during write of size 4 at 0x23679618 by thread #1 Locks held: none at 0x6819003: ??? by 0x681D713: ??? by 0x68200DE: ??? by 0x684B8F8: QTextCursor::insertText(QString const&, QTextCharFormat const&) by 0x684BCB9: QTextCursor::insertText(QString const&) by 0x139DA06C: TextEditor::BaseTextEditorWidget::keyPressEvent(QKeyEvent*) (basetexteditor.cpp:1866) by 0x184C999F: CppEditor::Internal::CPPEditorWidget::keyPressEvent(QKeyEvent*) (cppeditor.cpp:1416) This conflicts with a previous read of size 4 by thread #18 Locks held: none at 0x680BC54: QTextDocument::revision() const by 0x159047F3: CppTools::CppEditorSupport::editorRevision() const (cpptoolseditorsupport.cpp:198) by 0x158E39BF: CppTools::Internal::CppModelManager::buildWorkingCopyList() (cppmodelmanager.cpp:525) by 0x158E3D5B: CppTools::Internal::CppModelManager::workingCopy() const (cppmodelmanager.cpp:544) by 0x1589FF6F: CppTools::Internal::CppCompletionAssistInterface::getCppSpecifics() const (cppcompletionassist.cpp:1957) by 0x158A1158: CppTools::Internal::CppCompletionAssistInterface::snapshot() const (cppcompletionassist.h:200) by 0x1589707C: CppTools::Internal::CppCompletionAssistProcessor::startCompletionInternal(QString, unsigned int, unsigned int, QString const&, int) (cppcompletionassist.cpp:1212) by 0x15893CC7: CppTools::Internal::CppCompletionAssistProcessor::startCompletionHelper() (cppcompletionassist.cpp:970) --- Possible data race during write of size 4 at 0x24C8AD18 by thread #1 Locks held: none at 0x684AF23: QTextCursor::beginEditBlock() by 0x139D7D05: TextEditor::BaseTextEditorWidget::keyPressEvent(QKeyEvent*) (basetexteditor.cpp:1578) by 0x184C999F: CppEditor::Internal::CPPEditorWidget::keyPressEvent(QKeyEvent*) (cppeditor.cpp:1416) ... by 0x40F15A: main (main.cpp:533) This conflicts with a previous read of size 4 by thread #11 Locks held: none at 0x680BC54: QTextDocument::revision() const by 0x159048D3: CppTools::CppEditorSupport::editorRevision() const (cpptoolseditorsupport.cpp:198) by 0x158E3A9F: CppTools::Internal::CppModelManager::buildWorkingCopyList() (cppmodelmanager.cpp:525) by 0x158E3E3B: CppTools::Internal::CppModelManager::workingCopy() const (cppmodelmanager.cpp:544) by 0x1590741E: parse(QFutureInterface<void>&, QSharedPointer<CppTools::SnapshotUpdater>) (cpptoolseditorsupport.cpp:299) Task-number: QTCREATORBUG-12030 Change-Id: Idf0aa47f1f6bfd6814a961fe39d3b19b98f934f5 Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpptoolseditorsupport.cpp')
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index 130b24a9a3..01d05e143c 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -282,7 +282,8 @@ void CppEditorSupport::updateDocument()
m_updateDocumentTimer->start(m_updateDocumentInterval);
}
-static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater> updater)
+static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater> updater,
+ CppModelManagerInterface::WorkingCopy workingCopy)
{
future.setProgressRange(0, 1);
if (future.isCanceled()) {
@@ -291,7 +292,7 @@ static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater
}
CppModelManager *cmm = qobject_cast<CppModelManager *>(CppModelManager::instance());
- updater->update(cmm->workingCopy());
+ updater->update(workingCopy);
cmm->finishedRefreshingSourceFiles(QStringList(updater->fileInEditor()));
future.setProgressValue(1);
@@ -310,7 +311,8 @@ void CppEditorSupport::updateDocumentNow()
if (m_highlightingSupport && !m_highlightingSupport->requiresSemanticInfo())
startHighlighting();
- m_documentParser = QtConcurrent::run(&parse, snapshotUpdater());
+ m_documentParser = QtConcurrent::run(&parse, snapshotUpdater(),
+ CppModelManager::instance()->workingCopy());
}
}