aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-03-02 12:39:50 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2018-03-02 12:39:50 +0100
commitd7cfd25e401cf55bc7a19f15779f05cd4b69b6d2 (patch)
treef6d5207f96e6274e1463c5ca3bac2cab5ea063c2 /src
parentb8ce406bad97dea7e355dbf10dc3681839855845 (diff)
parentd447d42bf2684b6021ec8238f46b59dc7a31b9ce (diff)
Merge 1.11 into master
Diffstat (limited to 'src')
-rw-r--r--src/app/qbs/commandlinefrontend.cpp2
-rw-r--r--src/lib/corelib/buildgraph/jscommandexecutor.cpp2
-rw-r--r--src/lib/corelib/buildgraph/rulesevaluationcontext.cpp2
-rw-r--r--src/lib/corelib/language/scriptengine.cpp11
-rw-r--r--src/lib/corelib/language/scriptengine.h5
-rw-r--r--src/lib/corelib/tools/id.cpp34
-rw-r--r--src/lib/corelib/tools/id.h1
-rw-r--r--src/lib/corelib/tools/msvcinfo.cpp7
-rw-r--r--src/lib/qtprofilesetup/templates/QtModule.qbs2
-rw-r--r--src/lib/qtprofilesetup/templates/core.qbs2
10 files changed, 39 insertions, 29 deletions
diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp
index dd26846f4..9ee1248e7 100644
--- a/src/app/qbs/commandlinefrontend.cpp
+++ b/src/app/qbs/commandlinefrontend.cpp
@@ -254,7 +254,7 @@ void CommandLineFrontend::handleJobFinished(bool success, AbstractJob *job)
// fall through
case BuildCommandType:
case CleanCommandType:
- qApp->quit();
+ qApp->exit(m_cancelStatus == CancelStatusNone ? EXIT_SUCCESS : EXIT_FAILURE);
break;
default:
Q_ASSERT_X(false, Q_FUNC_INFO, "Missing case in switch statement");
diff --git a/src/lib/corelib/buildgraph/jscommandexecutor.cpp b/src/lib/corelib/buildgraph/jscommandexecutor.cpp
index 6891c0961..35e80cb68 100644
--- a/src/lib/corelib/buildgraph/jscommandexecutor.cpp
+++ b/src/lib/corelib/buildgraph/jscommandexecutor.cpp
@@ -169,7 +169,7 @@ private:
ScriptEngine *provideScriptEngine()
{
if (!m_scriptEngine)
- m_scriptEngine = new ScriptEngine(m_logger, EvalContext::JsCommand, this);
+ m_scriptEngine = ScriptEngine::create(m_logger, EvalContext::JsCommand, this);
return m_scriptEngine;
}
diff --git a/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp b/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
index 0b6774adb..c81e40c4f 100644
--- a/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
+++ b/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
@@ -55,7 +55,7 @@ namespace Internal {
RulesEvaluationContext::RulesEvaluationContext(const Logger &logger)
: m_logger(logger),
- m_engine(new ScriptEngine(m_logger, EvalContext::RuleExecution)),
+ m_engine(ScriptEngine::create(m_logger, EvalContext::RuleExecution)),
m_observer(nullptr),
m_initScopeCalls(0)
{
diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp
index 0974efe45..568a927b2 100644
--- a/src/lib/corelib/language/scriptengine.cpp
+++ b/src/lib/corelib/language/scriptengine.cpp
@@ -97,6 +97,8 @@ uint qHash(const ScriptEngine::PropertyCacheKey &k, uint seed = 0)
combineHash(qHash(k.m_propertyName), qHash(k.m_propertyMap), seed), seed);
}
+std::mutex ScriptEngine::m_creationDestructionMutex;
+
ScriptEngine::ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent)
: QScriptEngine(parent), m_scriptImporter(new ScriptImporter(this)),
m_modulePropertyScriptClass(nullptr),
@@ -116,8 +118,17 @@ ScriptEngine::ScriptEngine(Logger &logger, EvalContext evalContext, QObject *par
extendJavaScriptBuiltins();
}
+ScriptEngine *ScriptEngine::create(Logger &logger, EvalContext evalContext, QObject *parent)
+{
+ std::lock_guard<std::mutex> lock(m_creationDestructionMutex);
+ return new ScriptEngine(logger, evalContext, parent);
+}
+
ScriptEngine::~ScriptEngine()
{
+ m_creationDestructionMutex.lock();
+ connect(this, &QObject::destroyed, std::bind(&std::mutex::unlock, &m_creationDestructionMutex));
+
releaseResourcesOfScriptObjects();
delete (m_scriptImporter);
if (m_elapsedTimeImporting != -1) {
diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h
index ecf1dd461..4157ea762 100644
--- a/src/lib/corelib/language/scriptengine.h
+++ b/src/lib/corelib/language/scriptengine.h
@@ -58,6 +58,7 @@
#include <QtScript/qscriptengine.h>
#include <memory>
+#include <mutex>
#include <stack>
#include <tuple>
#include <unordered_map>
@@ -98,8 +99,9 @@ enum class ObserveMode { Enabled, Disabled };
class QBS_AUTOTEST_EXPORT ScriptEngine : public QScriptEngine
{
Q_OBJECT
-public:
ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent = nullptr);
+public:
+ static ScriptEngine *create(Logger &logger, EvalContext evalContext, QObject *parent = nullptr);
~ScriptEngine();
Logger &logger() const { return m_logger; }
@@ -289,6 +291,7 @@ private:
friend bool operator==(const PropertyCacheKey &lhs, const PropertyCacheKey &rhs);
friend uint qHash(const ScriptEngine::PropertyCacheKey &k, uint seed);
+ static std::mutex m_creationDestructionMutex;
ScriptImporter *m_scriptImporter;
QScriptClass *m_modulePropertyScriptClass;
QScriptClass *m_productPropertyScriptClass = nullptr;
diff --git a/src/lib/corelib/tools/id.cpp b/src/lib/corelib/tools/id.cpp
index 66c5f85d7..1c61792e6 100644
--- a/src/lib/corelib/tools/id.cpp
+++ b/src/lib/corelib/tools/id.cpp
@@ -43,6 +43,7 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qhash.h>
+#include <mutex>
#include <vector>
namespace qbs {
@@ -117,11 +118,19 @@ static int firstUnusedId = Id::IdsPerPlugin * Id::ReservedPlugins;
static QHash<int, StringHolder> stringFromId;
static IdCache idFromString;
+static std::mutex mutex;
+
+static QByteArray getStringFromId(int id)
+{
+ std::lock_guard<std::mutex> lock(mutex);
+ return stringFromId.value(id).str;
+}
static int theId(const char *str, int n = 0)
{
QBS_ASSERT(str && *str, return 0);
StringHolder sh(str, n);
+ std::lock_guard<std::mutex> lock(mutex);
int res = idFromString.value(sh, 0);
if (res == 0) {
res = firstUnusedId++;
@@ -178,7 +187,7 @@ Id::Id(const QByteArray &name)
QByteArray Id::name() const
{
- return stringFromId.value(m_id).str;
+ return getStringFromId(m_id);
}
/*!
@@ -193,7 +202,7 @@ QByteArray Id::name() const
QString Id::toString() const
{
- return QString::fromUtf8(stringFromId.value(m_id).str);
+ return QString::fromUtf8(getStringFromId(m_id));
}
/*!
@@ -205,7 +214,7 @@ QString Id::toString() const
QVariant Id::toSetting() const
{
- return QVariant(QString::fromUtf8(stringFromId.value(m_id).str));
+ return QVariant(QString::fromUtf8(getStringFromId(m_id)));
}
/*!
@@ -260,26 +269,9 @@ Id Id::withPrefix(const char *prefix) const
return Id(ba.constData());
}
-
-/*!
- Associates a id with its uid and its string
- representation.
-
- The uid should be taken from the plugin's private range.
-
- \sa fromSetting()
-*/
-
-void Id::registerId(int uid, const char *name)
-{
- StringHolder sh(name, 0);
- idFromString[sh] = uid;
- stringFromId[uid] = sh;
-}
-
bool Id::operator==(const char *name) const
{
- const char *string = stringFromId.value(m_id).str;
+ const char *string = getStringFromId(m_id);
if (string && name)
return strcmp(string, name) == 0;
else
diff --git a/src/lib/corelib/tools/id.h b/src/lib/corelib/tools/id.h
index aedecd66e..f0c3b1588 100644
--- a/src/lib/corelib/tools/id.h
+++ b/src/lib/corelib/tools/id.h
@@ -77,7 +77,6 @@ public:
int uniqueIdentifier() const { return m_id; }
static Id fromUniqueIdentifier(int uid) { return Id(uid); }
static Id fromSetting(const QVariant &variant); // Good to use.
- static void registerId(int uid, const char *name);
private:
// Intentionally unimplemented
diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp
index 0d22a9a56..27e523d90 100644
--- a/src/lib/corelib/tools/msvcinfo.cpp
+++ b/src/lib/corelib/tools/msvcinfo.cpp
@@ -54,17 +54,20 @@
#endif
#include <algorithm>
+#include <mutex>
using namespace qbs;
using namespace qbs::Internal;
+static std::recursive_mutex envMutex;
+
static QString mkStr(const char *s) { return QString::fromLocal8Bit(s); }
static QString mkStr(const QByteArray &ba) { return mkStr(ba.constData()); }
class TemporaryEnvChanger
{
public:
- TemporaryEnvChanger(const QProcessEnvironment &envChanges)
+ TemporaryEnvChanger(const QProcessEnvironment &envChanges) : m_locker(envMutex)
{
QProcessEnvironment currentEnv = QProcessEnvironment::systemEnvironment();
for (const QString &key : envChanges.keys()) {
@@ -81,6 +84,7 @@ public:
private:
QProcessEnvironment m_changesToRestore;
+ std::lock_guard<std::recursive_mutex> m_locker;
};
static QByteArray runProcess(const QString &exeFilePath, const QStringList &args,
@@ -235,6 +239,7 @@ void MSVC::determineCompilerVersion()
}
DummyFile fileDeleter(cppFilePath);
+ std::lock_guard<std::recursive_mutex> locker(envMutex);
const QByteArray origPath = qgetenv("PATH");
qputenv("PATH", environment.value(StringConstants::pathEnvVar()).toLatin1() + ';' + origPath);
QByteArray versionStr = runProcess(
diff --git a/src/lib/qtprofilesetup/templates/QtModule.qbs b/src/lib/qtprofilesetup/templates/QtModule.qbs
index 0daf02fda..fcc8797cb 100644
--- a/src/lib/qtprofilesetup/templates/QtModule.qbs
+++ b/src/lib/qtprofilesetup/templates/QtModule.qbs
@@ -5,7 +5,7 @@ Module {
condition: (qbs.targetPlatform === targetPlatform || isCombinedUIKitBuild)
&& (!qbs.architecture
|| architectures.length === 0
- || architectures.contains(qbs.architecture) || !hasLibrary)
+ || architectures.contains(qbs.architecture))
readonly property bool isCombinedUIKitBuild: ["ios", "tvos", "watchos"].contains(targetPlatform)
&& ["x86", "x86_64"].contains(qbs.architecture)
diff --git a/src/lib/qtprofilesetup/templates/core.qbs b/src/lib/qtprofilesetup/templates/core.qbs
index 6741f8bcf..968f3efa0 100644
--- a/src/lib/qtprofilesetup/templates/core.qbs
+++ b/src/lib/qtprofilesetup/templates/core.qbs
@@ -11,7 +11,7 @@ Module {
condition: (qbs.targetPlatform === targetPlatform || isCombinedUIKitBuild)
&& (!qbs.architecture
|| architectures.length === 0
- || architectures.contains(qbs.architecture) || !hasLibrary)
+ || architectures.contains(qbs.architecture))
readonly property bool isCombinedUIKitBuild: ["ios", "tvos", "watchos"].contains(targetPlatform)
&& ["x86", "x86_64"].contains(qbs.architecture)