diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-09-08 09:55:11 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-09-09 15:30:39 +0000 |
commit | e51a3367ea7d73b5e3832d0d465afc0d567d926b (patch) | |
tree | 284ec7d696216eaf98d5c9be55015e3a0716b0b0 /src | |
parent | fc98027c20cdf65121bc1bf572f7e76a7e449142 (diff) |
Fix race conditions
Static variables must be initialized in a thread-safe way, because
resolving for different profiles happens in parallel.
Change-Id: I5d9b5e1233773e2e4371194df0501f4c2670396a
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/jsextensions/jsextensions.cpp | 37 | ||||
-rw-r--r-- | src/lib/corelib/jsextensions/jsextensions.h | 6 |
2 files changed, 19 insertions, 24 deletions
diff --git a/src/lib/corelib/jsextensions/jsextensions.cpp b/src/lib/corelib/jsextensions/jsextensions.cpp index d09c9cf1d..3513f640c 100644 --- a/src/lib/corelib/jsextensions/jsextensions.cpp +++ b/src/lib/corelib/jsextensions/jsextensions.cpp @@ -42,9 +42,28 @@ #include <QScriptEngine> +#include <utility> + namespace qbs { namespace Internal { +typedef QHash<QString, void (*)(QScriptValue)> InitializerMap; +static InitializerMap initializers() +{ + static const InitializerMap theMap = { + std::make_pair(QLatin1String("Environment"), &initializeJsExtensionEnvironment), + std::make_pair(QLatin1String("File"), &initializeJsExtensionFile), + std::make_pair(QLatin1String("FileInfo"), &initializeJsExtensionFileInfo), + std::make_pair(QLatin1String("Process"), &initializeJsExtensionProcess), + std::make_pair(QLatin1String("Xml"), &initializeJsExtensionXml), + std::make_pair(QLatin1String("TemporaryDir"), &initializeJsExtensionTemporaryDir), + std::make_pair(QLatin1String("TextFile"), &initializeJsExtensionTextFile), + std::make_pair(QLatin1String("PropertyList"), &initializeJsExtensionPropertyList), + std::make_pair(QLatin1String("Utilities"), &initializeJsExtensionUtilities) + }; + return theMap; +} + void JsExtensions::setupExtensions(const QStringList &names, QScriptValue scope) { foreach (const QString &name, names) @@ -66,23 +85,5 @@ bool JsExtensions::hasExtension(const QString &name) return initializers().contains(name); } -JsExtensions::InitializerMap JsExtensions::initializers() -{ - if (m_initializers.isEmpty()) { - m_initializers.insert(QLatin1String("Environment"), &initializeJsExtensionEnvironment); - m_initializers.insert(QLatin1String("File"), &initializeJsExtensionFile); - m_initializers.insert(QLatin1String("FileInfo"), &initializeJsExtensionFileInfo); - m_initializers.insert(QLatin1String("Process"), &initializeJsExtensionProcess); - m_initializers.insert(QLatin1String("Xml"), &initializeJsExtensionXml); - m_initializers.insert(QLatin1String("TemporaryDir"), &initializeJsExtensionTemporaryDir); - m_initializers.insert(QLatin1String("TextFile"), &initializeJsExtensionTextFile); - m_initializers.insert(QLatin1String("PropertyList"), &initializeJsExtensionPropertyList); - m_initializers.insert(QLatin1String("Utilities"), &initializeJsExtensionUtilities); - } - return m_initializers; -} - -JsExtensions::InitializerMap JsExtensions::m_initializers; - } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/jsextensions/jsextensions.h b/src/lib/corelib/jsextensions/jsextensions.h index f79b6f7ab..253960ad9 100644 --- a/src/lib/corelib/jsextensions/jsextensions.h +++ b/src/lib/corelib/jsextensions/jsextensions.h @@ -48,12 +48,6 @@ public: static void setupExtensions(const QStringList &names, QScriptValue scope); static QScriptValue loadExtension(QScriptEngine *engine, const QString &name); static bool hasExtension(const QString &name); - -private: - typedef QHash<QString, void (*)(QScriptValue)> InitializerMap; - static InitializerMap initializers(); - - static InitializerMap m_initializers; }; } // namespace Internal |