diff options
author | Nils Gladitz <nilsgladitz@gmail.com> | 2013-10-18 22:38:35 (GMT) |
---|---|---|
committer | Nils Gladitz <nilsgladitz@gmail.com> | 2013-10-18 22:38:35 (GMT) |
commit | e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a (patch) | |
tree | b3ebff5d92cc530aaeb383c1b1f9c16be98821ab /Source | |
parent | 44017a4767e183d93b4c3f8f9c3000bbc4e33d2b (diff) | |
download | CMake-e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a.zip CMake-e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a.tar.gz CMake-e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a.tar.bz2 |
CTest: prioritize tests by their depth in the dependency graph
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CTest/cmCTestMultiProcessHandler.cxx | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index 794ce7a..e1f829d 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -441,11 +441,41 @@ int cmCTestMultiProcessHandler::SearchByName(std::string name) //--------------------------------------------------------- void cmCTestMultiProcessHandler::CreateTestCostList() { + std::list<TestSet> priorityStack; + priorityStack.push_back(TestSet()); + TestSet &topLevel = priorityStack.back(); + + for(TestMap::const_iterator i = this->Tests.begin(); + i != this->Tests.end(); ++i) + { + topLevel.insert(i->first); + } + + while(priorityStack.back().size()) + { + TestSet &previousSet = priorityStack.back(); + priorityStack.push_back(TestSet()); + TestSet ¤tSet = priorityStack.back(); + + for(TestSet::iterator i = previousSet.begin(); + i != previousSet.end(); ++i) + { + TestSet const& dependencies = this->Tests[*i]; + currentSet.insert(dependencies.begin(), dependencies.end()); + } + + for(TestSet::iterator i = currentSet.begin(); + i != currentSet.end(); ++i) + { + previousSet.erase(*i); + } + } + + priorityStack.pop_back(); + for(TestMap::iterator i = this->Tests.begin(); i != this->Tests.end(); ++i) { - SortedTests.push_back(i->first); - //If the test failed last time, it should be run first, so max the cost. //Only do this for parallel runs; in non-parallel runs, avoid clobbering //the test's explicitly set cost. @@ -457,8 +487,19 @@ void cmCTestMultiProcessHandler::CreateTestCostList() } } - TestComparator comp(this); - std::stable_sort(SortedTests.begin(), SortedTests.end(), comp); + for(std::list<TestSet>::reverse_iterator i = priorityStack.rbegin(); + i != priorityStack.rend(); ++i) + { + TestSet ¤tSet = *i; + TestComparator comp(this); + + TestList sortedCopy; + sortedCopy.insert(sortedCopy.end(), currentSet.begin(), currentSet.end()); + std::stable_sort(sortedCopy.begin(), sortedCopy.end(), comp); + + this->SortedTests.insert(this->SortedTests.end(), + sortedCopy.begin(), sortedCopy.end()); + } } //--------------------------------------------------------- |