diff options
author | Zach Mullen <zach.mullen@kitware.com> | 2010-02-25 21:23:49 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2010-02-26 16:02:05 (GMT) |
commit | b4d27dc041c9164d6f3ad39e192f4b7d116ca3b3 (patch) | |
tree | 68d044c519a253948acbb09809078163dd4df63d /Source/CTest/cmCTestMultiProcessHandler.cxx | |
parent | 55f012989c1aadd9dac1036c2e27df1853243392 (diff) | |
download | CMake-b4d27dc041c9164d6f3ad39e192f4b7d116ca3b3.zip CMake-b4d27dc041c9164d6f3ad39e192f4b7d116ca3b3.tar.gz CMake-b4d27dc041c9164d6f3ad39e192f4b7d116ca3b3.tar.bz2 |
Use historical average of test times to schedule tests.
Diffstat (limited to 'Source/CTest/cmCTestMultiProcessHandler.cxx')
-rw-r--r-- | Source/CTest/cmCTestMultiProcessHandler.cxx | 110 |
1 files changed, 89 insertions, 21 deletions
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index b6226a3..02974a2 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -76,6 +76,7 @@ void cmCTestMultiProcessHandler::RunTests() { } this->MarkFinished(); + this->UpdateCostData(); } //--------------------------------------------------------- @@ -272,8 +273,7 @@ bool cmCTestMultiProcessHandler::CheckOutput() this->TestRunningMap[test] = false; this->RunningTests.erase(p); this->WriteCheckpoint(test); - this->WriteCostData(test, static_cast<float>( - p->GetTestResults().ExecutionTime)); + this->RunningCount -= GetProcessorsUsed(test); delete p; } @@ -281,24 +281,88 @@ bool cmCTestMultiProcessHandler::CheckOutput() } //--------------------------------------------------------- -void cmCTestMultiProcessHandler::ReadCostData() +void cmCTestMultiProcessHandler::UpdateCostData() { std::string fname = this->CTest->GetBinaryDir() + "/Testing/Temporary/CTestCostData.txt"; + std::string tmpout = fname + ".tmp"; + std::fstream fout; + fout.open(tmpout.c_str(), std::ios::out); + + PropertiesMap temp = this->Properties; - if(cmSystemTools::FileExists(fname.c_str(), true) - && this->ParallelLevel > 1) - { + if(cmSystemTools::FileExists(fname.c_str())) + { std::ifstream fin; fin.open(fname.c_str()); + std::string line; while(std::getline(fin, line)) { std::vector<cmsys::String> parts = cmSystemTools::SplitString(line.c_str(), ' '); + //Format: <name> <previous_runs> <avg_cost> + if(parts.size() < 3) break; + + std::string name = parts[0]; + int prev = atoi(parts[1].c_str()); + float cost = static_cast<float>(atof(parts[2].c_str())); + + int index = this->SearchByName(name); + if(index == -1) + { + // This test is not in memory. We just rewrite the entry + fout << name << " " << prev << " " << cost << "\n"; + } + else + { + // Update with our new average cost + fout << name << " " << this->Properties[index]->PreviousRuns << " " + << this->Properties[index]->Cost << "\n"; + temp.erase(index); + } + } + fin.close(); + cmSystemTools::RemoveFile(fname.c_str()); + } + + // Add all tests not previously listed in the file + for(PropertiesMap::iterator i = temp.begin(); i != temp.end(); ++i) + { + fout << i->second->Name << " " << i->second->PreviousRuns << " " + << i->second->Cost << "\n"; + } + fout.close(); + cmSystemTools::RenameFile(tmpout.c_str(), fname.c_str()); +} + +//--------------------------------------------------------- +void cmCTestMultiProcessHandler::ReadCostData() +{ + //TODO variable location of the cost data file + std::string fname = this->CTest->GetBinaryDir() + + "/Testing/Temporary/CTestCostData.txt"; + if(cmSystemTools::FileExists(fname.c_str(), true)) + { + std::ifstream fin; + fin.open(fname.c_str()); + std::string line; + while(std::getline(fin, line)) + { + std::vector<cmsys::String> parts = + cmSystemTools::SplitString(line.c_str(), ' '); - int index = atoi(parts[0].c_str()); - float cost = static_cast<float>(atof(parts[1].c_str())); + // Probably an older version of the file, will be fixed next run + if(parts.size() < 3) break; + + std::string name = parts[0]; + int prev = atoi(parts[1].c_str()); + float cost = static_cast<float>(atof(parts[2].c_str())); + + int index = this->SearchByName(name); + if(index == -1) continue; + + this->Properties[index]->PreviousRuns = prev; if(this->Properties[index] && this->Properties[index]->Cost == 0) { this->Properties[index]->Cost = cost; @@ -306,28 +370,32 @@ void cmCTestMultiProcessHandler::ReadCostData() } fin.close(); } - cmSystemTools::RemoveFile(fname.c_str()); } //--------------------------------------------------------- -void cmCTestMultiProcessHandler::CreateTestCostList() +int cmCTestMultiProcessHandler::SearchByName(std::string name) { - for(TestMap::iterator i = this->Tests.begin(); - i != this->Tests.end(); ++i) + int index = -1; + + for(PropertiesMap::iterator i = this->Properties.begin(); + i != this->Properties.end(); ++i) { - this->TestCosts[this->Properties[i->first]->Cost].insert(i->first); + if(i->second->Name == name) + { + index = i->first; + } } + return index; } //--------------------------------------------------------- -void cmCTestMultiProcessHandler::WriteCostData(int index, float cost) +void cmCTestMultiProcessHandler::CreateTestCostList() { - std::string fname = this->CTest->GetBinaryDir() - + "/Testing/Temporary/CTestCostData.txt"; - std::fstream fout; - fout.open(fname.c_str(), std::ios::out | std::ios::app); - fout << index << " " << cost << "\n"; - fout.close(); + for(TestMap::iterator i = this->Tests.begin(); + i != this->Tests.end(); ++i) + { + this->TestCosts[this->Properties[i->first]->Cost].insert(i->first); + } } //--------------------------------------------------------- @@ -336,7 +404,7 @@ void cmCTestMultiProcessHandler::WriteCheckpoint(int index) std::string fname = this->CTest->GetBinaryDir() + "/Testing/Temporary/CTestCheckpoint.txt"; std::fstream fout; - fout.open(fname.c_str(), std::ios::app); + fout.open(fname.c_str(), std::ios::app | std::ios::out); fout << index << "\n"; fout.close(); } |