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>
This commit is contained in:
Nikolai Kosjar
2014-04-10 11:13:37 -04:00
committed by Erik Verbruggen
parent 291b80cb33
commit 9b2672cb05
3 changed files with 15 additions and 6 deletions

View File

@@ -31,6 +31,7 @@
#define CPPCOMPLETIONASSIST_H
#include "cppcompletionassistprovider.h"
#include "cppmodelmanagerinterface.h"
#include <cplusplus/Icons.h>
#include <cplusplus/TypeOfExpression.h>
@@ -175,11 +176,13 @@ public:
CppCompletionAssistInterface(TextEditor::BaseTextEditor *editor,
QTextDocument *textDocument,
int position,
TextEditor::AssistReason reason)
TextEditor::AssistReason reason,
const CppModelManagerInterface::WorkingCopy &workingCopy)
: TextEditor::DefaultAssistInterface(textDocument, position, editor->document()->filePath(),
reason)
, m_editor(editor)
, m_gotCppSpecifics(false)
, m_workingCopy(workingCopy)
{}
CppCompletionAssistInterface(QTextDocument *textDocument,
@@ -206,6 +209,7 @@ private:
TextEditor::BaseTextEditor *m_editor;
mutable bool m_gotCppSpecifics;
CppModelManagerInterface::WorkingCopy m_workingCopy;
mutable CPlusPlus::Snapshot m_snapshot;
mutable QStringList m_includePaths;
mutable QStringList m_frameworkPaths;