diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-03-02 12:39:50 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-03-02 12:39:50 +0100 |
commit | d7cfd25e401cf55bc7a19f15779f05cd4b69b6d2 (patch) | |
tree | f6d5207f96e6274e1463c5ca3bac2cab5ea063c2 /src | |
parent | b8ce406bad97dea7e355dbf10dc3681839855845 (diff) | |
parent | d447d42bf2684b6021ec8238f46b59dc7a31b9ce (diff) |
Merge 1.11 into master
Change-Id: Ided96fe9c47e59b08efdcc314d97ecd164d12b23
Diffstat (limited to 'src')
-rw-r--r-- | src/app/qbs/commandlinefrontend.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/jscommandexecutor.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rulesevaluationcontext.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.cpp | 11 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.h | 5 | ||||
-rw-r--r-- | src/lib/corelib/tools/id.cpp | 34 | ||||
-rw-r--r-- | src/lib/corelib/tools/id.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/tools/msvcinfo.cpp | 7 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/QtModule.qbs | 2 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/core.qbs | 2 |
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) |