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.
This commit is contained in:
Brad King
2017-12-15 15:10:43 -05:00
parent 61ab5a8ef4
commit 7e0eb77f2f
2 changed files with 22 additions and 21 deletions

View File

@@ -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 {
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;
return true;
}
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;
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

View File

@@ -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);