diff options
author | Ulf Hermann <ulf.hermann@digia.com> | 2014-01-30 13:34:21 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-30 13:44:37 +0100 |
commit | 80fdecb3a548f1afbb3000ef62fed6d3f942f7ea (patch) | |
tree | f8aee124a8838ec94fa18bbee2e87cbea055ae78 /src/qml/qml/qqmlimport.cpp | |
parent | 0d0ffba93895316b9a395e28b1165b103858fea5 (diff) |
Make QML import thread safe.
Protect the common qmlEnginePluginsWithRegisteredTypes by a mutex.
Task-number: QTBUG-36542
Change-Id: Ia3c731f030b778d862239486cc6c1bfa441503e6
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 0848af07e3..97f82a2e8d 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -180,17 +180,22 @@ struct RegisteredPlugin { QPluginLoader* loader; }; -typedef QMap<QString, RegisteredPlugin> StringRegisteredPluginMap; +struct StringRegisteredPluginMap : public QMap<QString, RegisteredPlugin> { + QMutex mutex; +}; + Q_GLOBAL_STATIC(StringRegisteredPluginMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri and the PluginLoaders void qmlClearEnginePlugins() { - foreach (RegisteredPlugin plugin, qmlEnginePluginsWithRegisteredTypes()->values()) { + StringRegisteredPluginMap *plugins = qmlEnginePluginsWithRegisteredTypes(); + QMutexLocker lock(&plugins->mutex); + foreach (RegisteredPlugin plugin, plugins->values()) { QPluginLoader* loader = plugin.loader; if (!loader->unload()) qWarning("Unloading %s failed: %s", qPrintable(plugin.uri), qPrintable(loader->errorString())); delete loader; } - qmlEnginePluginsWithRegisteredTypes()->clear(); + plugins->clear(); } typedef QPair<QStaticPlugin, QJsonArray> StaticPluginPair; @@ -1909,10 +1914,12 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur const QString absoluteFilePath = fileInfo.absoluteFilePath(); bool engineInitialized = initializedPlugins.contains(absoluteFilePath); - bool typesRegistered = qmlEnginePluginsWithRegisteredTypes()->contains(absoluteFilePath); + StringRegisteredPluginMap *plugins = qmlEnginePluginsWithRegisteredTypes(); + QMutexLocker lock(&plugins->mutex); + bool typesRegistered = plugins->contains(absoluteFilePath); if (typesRegistered) { - Q_ASSERT_X(qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).uri == uri, + Q_ASSERT_X(plugins->value(absoluteFilePath).uri == uri, "QQmlImportDatabase::importPlugin", "Internal error: Plugin imported previously with different uri"); } @@ -1942,7 +1949,7 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur return false; } } else { - loader = qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).loader; + loader = plugins->value(absoluteFilePath).loader; } QObject *instance = loader->instance(); @@ -1951,7 +1958,7 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur RegisteredPlugin plugin; plugin.uri = uri; plugin.loader = loader; - qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, plugin); + plugins->insert(absoluteFilePath, plugin); // Continue with shared code path for dynamic and static plugins: if (!importPlugin(instance, fileInfo.absolutePath(), uri, typeNamespace, false, errors)) |