aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-09-08 09:55:11 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2016-09-09 15:30:39 +0000
commite51a3367ea7d73b5e3832d0d465afc0d567d926b (patch)
tree284ec7d696216eaf98d5c9be55015e3a0716b0b0 /src
parentfc98027c20cdf65121bc1bf572f7e76a7e449142 (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.cpp37
-rw-r--r--src/lib/corelib/jsextensions/jsextensions.h6
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