diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp index 47fb1fb6b8..0e7eaeea76 100644 --- a/src/corelib/io/qloggingregistry.cpp +++ b/src/corelib/io/qloggingregistry.cpp @@ -317,13 +317,12 @@ void QLoggingRegistry::init() const QMutexLocker locker(®istryMutex); - envRules = std::move(er); - qtConfigRules = std::move(qr); - configRules = std::move(cr); + ruleSets[EnvironmentRules] = std::move(er); + ruleSets[QtConfigRules] = std::move(qr); + ruleSets[ConfigRules] = std::move(cr); - if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) { + if (!ruleSets[EnvironmentRules].isEmpty() || !ruleSets[QtConfigRules].isEmpty() || !ruleSets[ConfigRules].isEmpty()) updateRules(); - } } /*! @@ -367,7 +366,7 @@ void QLoggingRegistry::setApiRules(const QString &content) const QMutexLocker locker(®istryMutex); - apiRules = parser.rules(); + ruleSets[ApiRules] = parser.rules(); updateRules(); } @@ -380,13 +379,6 @@ void QLoggingRegistry::setApiRules(const QString &content) */ void QLoggingRegistry::updateRules() { - rules.clear(); - rules.reserve(qtConfigRules.size() + configRules.size() + apiRules.size() + envRules.size()), - rules += qtConfigRules; - rules += configRules; - rules += apiRules; - rules += envRules; - for (auto it = categories.keyBegin(), end = categories.keyEnd(); it != end; ++it) (*categoryFilter)(*it); } @@ -406,8 +398,7 @@ QLoggingRegistry::installFilter(QLoggingCategory::CategoryFilter filter) QLoggingCategory::CategoryFilter old = categoryFilter; categoryFilter = filter; - for (auto it = categories.keyBegin(), end = categories.keyEnd(); it != end; ++it) - (*categoryFilter)(*it); + updateRules(); return old; } @@ -446,19 +437,22 @@ void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat) } QString categoryName = QLatin1String(cat->categoryName()); - for (const QLoggingRule &item : reg->rules) { - int filterpass = item.pass(categoryName, QtDebugMsg); - if (filterpass != 0) - debug = (filterpass > 0); - filterpass = item.pass(categoryName, QtInfoMsg); - if (filterpass != 0) - info = (filterpass > 0); - filterpass = item.pass(categoryName, QtWarningMsg); - if (filterpass != 0) - warning = (filterpass > 0); - filterpass = item.pass(categoryName, QtCriticalMsg); - if (filterpass != 0) - critical = (filterpass > 0); + + for (const auto &ruleSet : reg->ruleSets) { + for (const auto &rule : ruleSet) { + int filterpass = rule.pass(categoryName, QtDebugMsg); + if (filterpass != 0) + debug = (filterpass > 0); + filterpass = rule.pass(categoryName, QtInfoMsg); + if (filterpass != 0) + info = (filterpass > 0); + filterpass = rule.pass(categoryName, QtWarningMsg); + if (filterpass != 0) + warning = (filterpass > 0); + filterpass = rule.pass(categoryName, QtCriticalMsg); + if (filterpass != 0) + critical = (filterpass > 0); + } } cat->setEnabled(QtDebugMsg, debug); diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h index 69fc6ea4ec..a68b993cca 100644 --- a/src/corelib/io/qloggingregistry_p.h +++ b/src/corelib/io/qloggingregistry_p.h @@ -130,14 +130,20 @@ private: static void defaultCategoryFilter(QLoggingCategory *category); + enum RuleSet { + // sorted by order in which defaultCategoryFilter considers them: + QtConfigRules, + ConfigRules, + ApiRules, + EnvironmentRules, + + NumRuleSets + }; + QMutex registryMutex; // protected by mutex: - QVector qtConfigRules; - QVector configRules; - QVector envRules; - QVector apiRules; - QVector rules; + QVector ruleSets[NumRuleSets]; QHash categories; QLoggingCategory::CategoryFilter categoryFilter; diff --git a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp index 0a74dc64c0..1643eed3d2 100644 --- a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp +++ b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp @@ -202,18 +202,15 @@ private slots: QLoggingRegistry registry; registry.init(); - QCOMPARE(registry.apiRules.size(), 0); - QCOMPARE(registry.configRules.size(), 0); - QCOMPARE(registry.envRules.size(), 1); - - QCOMPARE(registry.rules.size(), 1); + QCOMPARE(registry.ruleSets[QLoggingRegistry::ApiRules].size(), 0); + QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 0); + QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].size(), 1); // check that QT_LOGGING_RULES take precedence qputenv("QT_LOGGING_RULES", "Digia.*=true"); registry.init(); - QCOMPARE(registry.envRules.size(), 2); - QCOMPARE(registry.envRules.at(1).enabled, true); - QCOMPARE(registry.rules.size(), 2); + QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].size(), 2); + QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].at(1).enabled, true); } void QLoggingRegistry_config() @@ -238,7 +235,7 @@ private slots: QLoggingRegistry registry; registry.init(); - QCOMPARE(registry.configRules.size(), 1); + QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 1); // remove file again QVERIFY(file.remove()); @@ -260,10 +257,9 @@ private slots: QLoggingRegistry *registry = QLoggingRegistry::instance(); // empty all rules , check default - registry->rules.clear(); - registry->apiRules.clear(); - registry->configRules.clear(); - registry->envRules.clear(); + registry->ruleSets[QLoggingRegistry::ApiRules].clear(); + registry->ruleSets[QLoggingRegistry::ConfigRules].clear(); + registry->ruleSets[QLoggingRegistry::EnvironmentRules].clear(); registry->updateRules(); QVERIFY(cat.isWarningEnabled()); @@ -271,7 +267,7 @@ private slots: // set Config rule QLoggingSettingsParser parser; parser.setContent("[Rules]\nDigia.*=false"); - registry->configRules=parser.rules(); + registry->ruleSets[QLoggingRegistry::ConfigRules] = parser.rules(); registry->updateRules(); QVERIFY(!cat.isWarningEnabled()); @@ -283,7 +279,7 @@ private slots: // set Env rule, should overwrite Config one parser.setContent("Digia.*=false"); - registry->envRules=parser.rules(); + registry->ruleSets[QLoggingRegistry::EnvironmentRules] = parser.rules(); registry->updateRules(); QVERIFY(!cat.isWarningEnabled());