From 400b64ac7cbb26c026ac27617ebb11f971bbc7ce Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 5 May 2017 00:12:44 +0200 Subject: [PATCH] revert commit for deterministic feature orders: breaks signal handlers! --- lib/ApplicationFeatures/ApplicationServer.cpp | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/ApplicationFeatures/ApplicationServer.cpp b/lib/ApplicationFeatures/ApplicationServer.cpp index fcce03eaff..4b0c10ecc0 100644 --- a/lib/ApplicationFeatures/ApplicationServer.cpp +++ b/lib/ApplicationFeatures/ApplicationServer.cpp @@ -384,27 +384,35 @@ void ApplicationServer::setupDependencies(bool failOnMissing) { // first insert all features, even the inactive ones std::vector features; for (auto& it : _features) { - auto const& us = it.second; auto insertPosition = features.end(); - for (size_t i = features.size(); i > 0; --i) { - auto const& other = features[i - 1]; - if (us->doesStartBefore(other->name())) { - // we start before the other feature. so move ourselves up - insertPosition = features.begin() + (i - 1); - } else if (other->doesStartBefore(us->name())) { - // the other feature starts before us. so stop moving up - break; - } else { - // no dependencies between the two features - if (us->name() < other->name()) { + if (!features.empty()) { + for (size_t i = features.size(); i > 0; --i) { + if (it.second->doesStartBefore(features[i - 1]->name())) { insertPosition = features.begin() + (i - 1); } } } features.insert(insertPosition, it.second); } - + + for (size_t i = 1; i < features.size(); ++i) { + auto feature = features[i]; + size_t insert = i; + for (size_t j = i; j > 0; --j) { + if (features[j - 1]->doesStartBefore(feature->name())) { + break; + } + insert = j - 1; + } + if (insert != i) { + for (size_t j = i; j > insert; --j) { + features[j] = features[j - 1]; + } + features[insert] = feature; + } + } + LOG_TOPIC(TRACE, Logger::STARTUP) << "ordered features:"; int position = 0; @@ -417,7 +425,7 @@ void ApplicationServer::setupDependencies(bool failOnMissing) { } LOG_TOPIC(TRACE, Logger::STARTUP) << "feature #" << ++position << ": " << feature->name() - << (feature->isEnabled() ? "" : " (disabled)") << dependencies; + << (feature->isEnabled() ? "" : " (disabled)") << " " << dependencies; } // remove all inactive features