[Cmake-commits] CMake branch, next, updated. v2.8.12-4358-g2b5ebe3
Nils Gladitz
nilsgladitz at gmail.com
Wed Oct 23 14:15:51 EDT 2013
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via 2b5ebe3f05b044055251d7c26566a47066d166a4 (commit)
via 7a665ae7e375db01e3eb89bb65967d03103cf164 (commit)
via 384beffc39a00c97ff23a8149e62af5b1cffc0ae (commit)
via adbe00d6e10906466c82ac3ddc8ef2d14a98a417 (commit)
via 1b750cbf9a77388b96b8fd3420c602d98a2e0ab9 (commit)
via 6d4d7ca9551e60592003272a3a2039af4dee192e (commit)
via e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a (commit)
via 44017a4767e183d93b4c3f8f9c3000bbc4e33d2b (commit)
from 1735ffb55667f3de13314bd1cecbb665f1b9c92f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2b5ebe3f05b044055251d7c26566a47066d166a4
commit 2b5ebe3f05b044055251d7c26566a47066d166a4
Merge: 1735ffb 7a665ae
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Wed Oct 23 14:15:47 2013 -0400
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Wed Oct 23 14:15:47 2013 -0400
Merge topic 'ctest-fix-run-serial' into next
7a665ae CTest: added test for RUN_SERIAL issue #14484
384beff CTest: added comments that describe the basic test sorting approach
adbe00d CTest: removed redundant copy of test dependency set
1b750cb CTest: perform cycle test early
6d4d7ca CTest: consider previously failed tests before all others
e809d8c CTest: prioritize tests by their depth in the dependency graph
44017a4 CTest: handle dependent and non dependent test requirements equally
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7a665ae7e375db01e3eb89bb65967d03103cf164
commit 7a665ae7e375db01e3eb89bb65967d03103cf164
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Oct 21 22:13:22 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Mon Oct 21 22:13:22 2013 +0200
CTest: added test for RUN_SERIAL issue #14484
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 2f6a456..0d35104 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -2074,6 +2074,8 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestParallel/testOutput.log"
)
+ ADD_TEST_MACRO(CTestTestSerialInDepends ${CMAKE_CTEST_COMMAND} -j 4)
+
if(NOT BORLAND)
set(CTestLimitDashJ_EXTRA_OPTIONS --force-new-ctest-process)
add_test_macro(CTestLimitDashJ ${CMAKE_CTEST_COMMAND} -j 4
diff --git a/Tests/CTestTestSerialInDepends/CMakeLists.txt b/Tests/CTestTestSerialInDepends/CMakeLists.txt
new file mode 100644
index 0000000..f99acab
--- /dev/null
+++ b/Tests/CTestTestSerialInDepends/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+enable_testing()
+
+function(my_add_test NAME COST)
+ add_test(NAME ${NAME}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${CMAKE_CTEST_COMMAND} -DTEST_NAME=${NAME}
+ -S ${CMAKE_CURRENT_SOURCE_DIR}/test.ctest)
+ set_tests_properties(${NAME} PROPERTIES COST ${COST})
+endfunction()
+
+my_add_test(i_like_company 1000)
+my_add_test(i_like_company_too 0)
+
+my_add_test(i_have_dependencies 1000)
+set_tests_properties(i_have_dependencies PROPERTIES
+ DEPENDS "i_want_to_be_alone")
+
+my_add_test(i_want_to_be_alone 100)
+set_tests_properties(i_want_to_be_alone PROPERTIES RUN_SERIAL 1)
diff --git a/Tests/CTestTestSerialInDepends/test.ctest b/Tests/CTestTestSerialInDepends/test.ctest
new file mode 100644
index 0000000..28ee094
--- /dev/null
+++ b/Tests/CTestTestSerialInDepends/test.ctest
@@ -0,0 +1,16 @@
+set(CTEST_RUN_CURRENT_SCRIPT 0)
+
+set(LOCK_FILE "${TEST_NAME}.lock")
+
+if("${TEST_NAME}" STREQUAL "i_want_to_be_alone")
+ file(GLOB LOCK_FILES *.lock)
+ if(LOCK_FILES)
+ message(FATAL_ERROR "found lock files of other tests even though this test should be running by itself: ${LOCK_FILES}")
+ endif()
+endif()
+
+file(WRITE "${LOCK_FILE}")
+ctest_sleep(3)
+file(REMOVE "${LOCK_FILE}")
+
+return()
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=384beffc39a00c97ff23a8149e62af5b1cffc0ae
commit 384beffc39a00c97ff23a8149e62af5b1cffc0ae
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Oct 21 19:55:14 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Mon Oct 21 19:55:14 2013 +0200
CTest: added comments that describe the basic test sorting approach
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 510d3c5..3dd446b 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -445,6 +445,8 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
priorityStack.push_back(TestSet());
TestSet &topLevel = priorityStack.back();
+ // Add previously failed tests to the front of the cost list
+ // and queue other tests for further sorting
for(TestMap::const_iterator i = this->Tests.begin();
i != this->Tests.end(); ++i)
{
@@ -460,6 +462,8 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
}
}
+ // Repeatedly move dependencies of the tests on the current dependency level
+ // to the next level until no further dependencies exist.
while(priorityStack.back().size())
{
TestSet &previousSet = priorityStack.back();
@@ -480,8 +484,11 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
}
}
+ // Remove the empty dependency level
priorityStack.pop_back();
+ // Reverse iterate over the different dependency levels (deepest first).
+ // Sort tests within each level by COST and append them to the cost list.
for(std::list<TestSet>::reverse_iterator i = priorityStack.rbegin();
i != priorityStack.rend(); ++i)
{
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=adbe00d6e10906466c82ac3ddc8ef2d14a98a417
commit adbe00d6e10906466c82ac3ddc8ef2d14a98a417
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Oct 21 19:32:53 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Mon Oct 21 19:32:53 2013 +0200
CTest: removed redundant copy of test dependency set
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 33e88b2..510d3c5 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -211,14 +211,8 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
}
}
- // copy the depend tests locally because when
- // a test is finished it will be removed from the depend list
- // and we don't want to be iterating a list while removing from it
- TestSet depends = this->Tests[test];
- size_t totalDepends = depends.size();
-
// if there are no depends left then run this test
- if(totalDepends == 0)
+ if(this->Tests[test].empty())
{
this->StartTestProcess(test);
return true;
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1b750cbf9a77388b96b8fd3420c602d98a2e0ab9
commit 1b750cbf9a77388b96b8fd3420c602d98a2e0ab9
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Sat Oct 19 09:28:18 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Sat Oct 19 09:28:18 2013 +0200
CTest: perform cycle test early
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index a9aaf0c..33e88b2 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -41,6 +41,7 @@ cmCTestMultiProcessHandler::cmCTestMultiProcessHandler()
this->Completed = 0;
this->RunningCount = 0;
this->StopTimePassed = false;
+ this->HasCycles = false;
}
cmCTestMultiProcessHandler::~cmCTestMultiProcessHandler()
@@ -65,6 +66,11 @@ cmCTestMultiProcessHandler::SetTests(TestMap& tests,
if(!this->CTest->GetShowOnly())
{
this->ReadCostData();
+ this->HasCycles = !this->CheckCycles();
+ if(this->HasCycles)
+ {
+ return;
+ }
this->CreateTestCostList();
}
}
@@ -79,7 +85,7 @@ void cmCTestMultiProcessHandler::SetParallelLevel(size_t level)
void cmCTestMultiProcessHandler::RunTests()
{
this->CheckResume();
- if(!this->CheckCycles())
+ if(this->HasCycles)
{
return;
}
diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h
index cd21d91..439a8f3 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.h
+++ b/Source/CTest/cmCTestMultiProcessHandler.h
@@ -111,6 +111,7 @@ protected:
std::set<cmCTestRunTest*> RunningTests; // current running tests
cmCTestTestHandler * TestHandler;
cmCTest* CTest;
+ bool HasCycles;
};
#endif
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6d4d7ca9551e60592003272a3a2039af4dee192e
commit 6d4d7ca9551e60592003272a3a2039af4dee192e
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Sat Oct 19 08:52:28 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Sat Oct 19 08:52:28 2013 +0200
CTest: consider previously failed tests before all others
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index e1f829d..a9aaf0c 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -448,7 +448,16 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
for(TestMap::const_iterator i = this->Tests.begin();
i != this->Tests.end(); ++i)
{
- topLevel.insert(i->first);
+ if(std::find(this->LastTestsFailed.begin(), this->LastTestsFailed.end(),
+ this->Properties[i->first]->Name) != this->LastTestsFailed.end())
+ {
+ //If the test failed last time, it should be run first.
+ this->SortedTests.push_back(i->first);
+ }
+ else
+ {
+ topLevel.insert(i->first);
+ }
}
while(priorityStack.back().size())
@@ -473,20 +482,6 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
priorityStack.pop_back();
- for(TestMap::iterator i = this->Tests.begin();
- i != this->Tests.end(); ++i)
- {
- //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.
- if(this->ParallelLevel > 1 &&
- std::find(this->LastTestsFailed.begin(), this->LastTestsFailed.end(),
- this->Properties[i->first]->Name) != this->LastTestsFailed.end())
- {
- this->Properties[i->first]->Cost = FLT_MAX;
- }
- }
-
for(std::list<TestSet>::reverse_iterator i = priorityStack.rbegin();
i != priorityStack.rend(); ++i)
{
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a
commit e809d8cfdf080e0f34122ef4aac0b1a93c6a7f6a
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Sat Oct 19 00:38:35 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Sat Oct 19 00:38:35 2013 +0200
CTest: prioritize tests by their depth in the dependency graph
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());
+ }
}
//---------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=44017a4767e183d93b4c3f8f9c3000bbc4e33d2b
commit 44017a4767e183d93b4c3f8f9c3000bbc4e33d2b
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Thu Oct 17 22:10:35 2013 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Thu Oct 17 22:10:35 2013 +0200
CTest: handle dependent and non dependent test requirements equally
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 76ddeea..794ce7a 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -210,30 +210,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
// and we don't want to be iterating a list while removing from it
TestSet depends = this->Tests[test];
size_t totalDepends = depends.size();
- if(totalDepends)
- {
- for(TestSet::const_iterator i = depends.begin();
- i != depends.end(); ++i)
- {
- // if the test is not already running then start it
- if(!this->TestRunningMap[*i])
- {
- // this test might be finished, but since
- // this is a copy of the depend map we might
- // still have it
- if(!this->TestFinishMap[*i])
- {
- // only start one test in this function
- return this->StartTest(*i);
- }
- else
- {
- // the depend has been and finished
- totalDepends--;
- }
- }
- }
- }
+
// if there are no depends left then run this test
if(totalDepends == 0)
{
@@ -262,25 +239,17 @@ void cmCTestMultiProcessHandler::StartNextTests()
TestList copy = this->SortedTests;
for(TestList::iterator test = copy.begin(); test != copy.end(); ++test)
{
- //in case this test has already been started due to dependency
- if(this->TestRunningMap[*test] || this->TestFinishMap[*test])
- {
- continue;
- }
size_t processors = GetProcessorsUsed(*test);
- if(processors > numToStart)
- {
- return;
- }
- if(this->StartTest(*test))
+
+ if(processors <= numToStart && this->StartTest(*test))
{
- if(this->StopTimePassed)
- {
- return;
- }
- numToStart -= processors;
+ if(this->StopTimePassed)
+ {
+ return;
+ }
+ numToStart -= processors;
}
- if(numToStart == 0)
+ else if(numToStart == 0)
{
return;
}
-----------------------------------------------------------------------
Summary of changes:
Source/CTest/cmCTestMultiProcessHandler.cxx | 130 ++++++++++++++-----------
Source/CTest/cmCTestMultiProcessHandler.h | 1 +
Tests/CMakeLists.txt | 2 +
Tests/CTestTestSerialInDepends/CMakeLists.txt | 21 ++++
Tests/CTestTestSerialInDepends/test.ctest | 16 +++
5 files changed, 111 insertions(+), 59 deletions(-)
create mode 100644 Tests/CTestTestSerialInDepends/CMakeLists.txt
create mode 100644 Tests/CTestTestSerialInDepends/test.ctest
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list