[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 &currentSet = 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 &currentSet = *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