Commit 934c77c2 authored by Christian Kamm's avatar Christian Kamm
Browse files

QmlJS/C++: Fix possible crash on exit.



It could crash if a thread to find exported cpp types was still running
after the ModelManager was destroyed.

Change-Id: Ia48fac9c2ad1296992af83af57e84cce8c4f95ae
Reviewed-by: default avatarLeandro T. C. Melo <leandro.melo@nokia.com>
parent 6da15db6
......@@ -133,6 +133,12 @@ ModelManager::ModelManager(QObject *parent):
updateImportPaths();
}
ModelManager::~ModelManager()
{
m_cppQmlTypesUpdater.cancel();
m_cppQmlTypesUpdater.waitForFinished();
}
void ModelManager::delayedInitialization()
{
CPlusPlus::CppModelManagerInterface *cppModelManager =
......@@ -724,27 +730,37 @@ void ModelManager::queueCppQmlTypeUpdate(const CPlusPlus::Document::Ptr &doc, bo
void ModelManager::startCppQmlTypeUpdate()
{
// if a future is still running, delay
if (m_cppQmlTypesUpdater.isRunning()) {
m_updateCppQmlTypesTimer->start();
return;
}
CPlusPlus::CppModelManagerInterface *cppModelManager =
CPlusPlus::CppModelManagerInterface::instance();
if (!cppModelManager)
return;
QtConcurrent::run(&ModelManager::updateCppQmlTypes,
this, cppModelManager, m_queuedCppDocuments);
m_cppQmlTypesUpdater = QtConcurrent::run(
&ModelManager::updateCppQmlTypes,
this, cppModelManager->snapshot(), m_queuedCppDocuments);
m_queuedCppDocuments.clear();
}
void ModelManager::updateCppQmlTypes(ModelManager *qmlModelManager,
CPlusPlus::CppModelManagerInterface *cppModelManager,
void ModelManager::updateCppQmlTypes(QFutureInterface<void> &interface,
ModelManager *qmlModelManager,
CPlusPlus::Snapshot snapshot,
QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents)
{
CppDataHash newData = qmlModelManager->cppData();
CPlusPlus::Snapshot snapshot = cppModelManager->snapshot();
FindExportedCppTypes finder(snapshot);
typedef QPair<CPlusPlus::Document::Ptr, bool> DocScanPair;
foreach (const DocScanPair &pair, documents) {
if (interface.isCanceled())
return;
CPlusPlus::Document::Ptr doc = pair.first;
const bool scan = pair.second;
const QString fileName = doc->fileName();
......
......@@ -69,6 +69,7 @@ class QMLJSTOOLS_EXPORT ModelManager: public QmlJS::ModelManagerInterface
public:
ModelManager(QObject *parent = 0);
~ModelManager();
void delayedInitialization();
......@@ -129,8 +130,9 @@ private slots:
private:
static bool matchesMimeType(const Core::MimeType &fileMimeType, const Core::MimeType &knownMimeType);
static void updateCppQmlTypes(ModelManager *qmlModelManager,
CPlusPlus::CppModelManagerInterface *cppModelManager,
static void updateCppQmlTypes(QFutureInterface<void> &interface,
ModelManager *qmlModelManager,
CPlusPlus::Snapshot snapshot,
QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents);
mutable QMutex m_mutex;
......@@ -144,6 +146,7 @@ private:
QTimer *m_updateCppQmlTypesTimer;
QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > m_queuedCppDocuments;
QFuture<void> m_cppQmlTypesUpdater;
CppDataHash m_cppDataHash;
mutable QMutex m_cppDataMutex;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment