summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/qmljs/qmljslink.cpp5
-rw-r--r--src/libs/qmljs/qmljsmodelmanagerinterface.cpp18
-rw-r--r--src/libs/qmljs/qmljsmodelmanagerinterface.h1
3 files changed, 21 insertions, 3 deletions
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index 121fee3301..4fcdb0a748 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -150,7 +150,9 @@ Link::Link(const Snapshot &snapshot, const ViewerContext &vContext, const Librar
d->diagnosticMessages = nullptr;
d->allDiagnosticMessages = nullptr;
- ModelManagerInterface *modelManager = ModelManagerInterface::instance();
+ QFutureInterface<void> fi;
+ fi.reportStarted();
+ ModelManagerInterface *modelManager = ModelManagerInterface::instanceForFuture(fi.future());
if (modelManager) {
const ModelManagerInterface::CppDataHash cppDataHash = modelManager->cppData();
{
@@ -176,6 +178,7 @@ Link::Link(const Snapshot &snapshot, const ViewerContext &vContext, const Librar
}
d->m_valueOwner->cppQmlTypes().setCppContextProperties(cppContextProperties);
}
+ fi.reportFinished();
}
ContextPtr Link::operator()(QHash<QString, QList<DiagnosticMessage> > *messages)
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
index dc9435787f..8eae3c3625 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
@@ -77,6 +77,7 @@ QMLJS_EXPORT Q_LOGGING_CATEGORY(qmljsLog, "qtc.qmljs.common", QtWarningMsg)
*/
static ModelManagerInterface *g_instance = nullptr;
+static QMutex g_instanceMutex;
static const char *qtQuickUISuffix = "ui.qml";
static void maybeAddPath(ViewerContext &context, const QString &path)
@@ -134,6 +135,7 @@ ModelManagerInterface::ModelManagerInterface(QObject *parent)
updateImportPaths();
+ QMutexLocker locker(&g_instanceMutex);
Q_ASSERT(! g_instance);
g_instance = this;
}
@@ -143,6 +145,8 @@ ModelManagerInterface::~ModelManagerInterface()
joinAllThreads(true);
m_cppQmlTypesUpdater.cancel();
m_cppQmlTypesUpdater.waitForFinished();
+
+ QMutexLocker locker(&g_instanceMutex);
Q_ASSERT(g_instance == this);
g_instance = nullptr;
}
@@ -199,6 +203,15 @@ ModelManagerInterface *ModelManagerInterface::instance()
return g_instance;
}
+// If the returned instance is not null, it's guaranteed that it will be valid at least as long
+// as the passed QFuture object isn't finished.
+ModelManagerInterface *ModelManagerInterface::instanceForFuture(const QFuture<void> &future)
+{
+ QMutexLocker locker(&g_instanceMutex);
+ if (g_instance)
+ g_instance->addFuture(future);
+ return g_instance;
+}
void ModelManagerInterface::writeWarning(const QString &msg)
{
if (ModelManagerInterface *i = instance())
@@ -1250,8 +1263,9 @@ void ModelManagerInterface::maybeQueueCppQmlTypeUpdate(const CPlusPlus::Document
if (!scan)
doc->releaseSourceAndAST();
- // delegate actual queuing to the gui thread
- QMetaObject::invokeMethod(this, [=] { queueCppQmlTypeUpdate(doc, scan); });
+ QMutexLocker locker(&g_instanceMutex);
+ if (g_instance) // delegate actual queuing to the gui thread
+ QMetaObject::invokeMethod(g_instance, [=] { queueCppQmlTypeUpdate(doc, scan); });
}
void ModelManagerInterface::queueCppQmlTypeUpdate(const CPlusPlus::Document::Ptr &doc, bool scan)
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h
index d4eb84e958..a4b6be96c1 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.h
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h
@@ -126,6 +126,7 @@ public:
static Dialect guessLanguageOfFile(const QString &fileName);
static QStringList globPatternsForLanguages(const QList<Dialect> &languages);
static ModelManagerInterface *instance();
+ static ModelManagerInterface *instanceForFuture(const QFuture<void> &future);
static void writeWarning(const QString &msg);
static WorkingCopy workingCopy();