summaryrefslogtreecommitdiffstats
path: root/Source/CTest/cmCTestMultiProcessHandler.cxx
diff options
context:
space:
mode:
authorZach Mullen <zach.mullen@kitware.com>2010-02-25 21:23:49 (GMT)
committerBrad King <brad.king@kitware.com>2010-02-26 16:02:05 (GMT)
commitb4d27dc041c9164d6f3ad39e192f4b7d116ca3b3 (patch)
tree68d044c519a253948acbb09809078163dd4df63d /Source/CTest/cmCTestMultiProcessHandler.cxx
parent55f012989c1aadd9dac1036c2e27df1853243392 (diff)
downloadCMake-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.cxx110
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();
}