Browse Source

cmCTestMultiProcessHandler: Fix StartNextTests loop on not-started test

If `StartTestProcess` does not start a test, propagate this information
back up to the `StartNextTests` loop so that it can move on to another
candidate without allocating processors to a test that didn't run.
Otherwise we have to wait for the next time `RunTests` loops around and
calls `StartNextTests` again.
Brad King 7 years ago
parent
commit
7e0eb77f2f

+ 19 - 18
Source/CTest/cmCTestMultiProcessHandler.cxx

@@ -112,7 +112,7 @@ void cmCTestMultiProcessHandler::RunTests()
   this->UpdateCostData();
 }
 
-void cmCTestMultiProcessHandler::StartTestProcess(int test)
+bool cmCTestMultiProcessHandler::StartTestProcess(int test)
 {
   std::chrono::system_clock::time_point stop_time = this->CTest->GetStopTime();
   if (stop_time != std::chrono::system_clock::time_point() &&
@@ -121,7 +121,7 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
                                            "Stopping all tests."
                  << std::endl);
     this->StopTimePassed = true;
-    return;
+    return false;
   }
 
   cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
@@ -155,23 +155,25 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
 
   if (testRun->StartTest(this->Total)) {
     this->RunningTests.insert(testRun);
-  } else {
+    return true;
+  }
 
-    for (auto& j : this->Tests) {
-      j.second.erase(test);
-    }
+  for (auto& j : this->Tests) {
+    j.second.erase(test);
+  }
 
-    this->UnlockResources(test);
-    this->Completed++;
-    this->TestFinishMap[test] = true;
-    this->TestRunningMap[test] = false;
-    this->RunningCount -= GetProcessorsUsed(test);
-    testRun->EndTest(this->Completed, this->Total, false);
-    if (!this->Properties[test]->Disabled) {
-      this->Failed->push_back(this->Properties[test]->Name);
-    }
-    delete testRun;
+  this->UnlockResources(test);
+  this->Completed++;
+  this->TestFinishMap[test] = true;
+  this->TestRunningMap[test] = false;
+  this->RunningCount -= GetProcessorsUsed(test);
+  testRun->EndTest(this->Completed, this->Total, false);
+  if (!this->Properties[test]->Disabled) {
+    this->Failed->push_back(this->Properties[test]->Name);
   }
+  delete testRun;
+
+  return false;
 }
 
 void cmCTestMultiProcessHandler::LockResources(int index)
@@ -229,8 +231,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
 
   // if there are no depends left then run this test
   if (this->Tests[test].empty()) {
-    this->StartTestProcess(test);
-    return true;
+    return this->StartTestProcess(test);
   }
   // This test was not able to start because it is waiting
   // on depends to run

+ 1 - 1
Source/CTest/cmCTestMultiProcessHandler.h

@@ -75,7 +75,7 @@ protected:
   // Start the next test or tests as many as are allowed by
   // ParallelLevel
   void StartNextTests();
-  void StartTestProcess(int test);
+  bool StartTestProcess(int test);
   bool StartTest(int test);
   // Mark the checkpoint for the given test
   void WriteCheckpoint(int index);