summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.cxx33
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.h2
-rw-r--r--Source/CTest/cmCTestRunTest.cxx2
-rw-r--r--Source/CTest/cmCTestTestHandler.cxx5
-rw-r--r--Source/CTest/cmCTestTestHandler.h1
-rw-r--r--Source/cmSetTestsPropertiesCommand.h5
6 files changed, 40 insertions, 8 deletions
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 07af804..fadf164 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -25,6 +25,7 @@ cmCTestMultiProcessHandler::cmCTestMultiProcessHandler()
{
this->ParallelLevel = 1;
this->Completed = 0;
+ this->RunningCount = 0;
}
// Set the tests
void
@@ -112,10 +113,27 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
else
{
this->Completed++;
+ this->RunningCount -= GetProcessorsUsed(test);
testRun->EndTest(this->Completed, this->Total, false);
}
}
+inline size_t cmCTestMultiProcessHandler::GetProcessorsUsed(int test)
+{
+ size_t processors =
+ static_cast<int>(this->Properties[test]->Processors);
+ //If this is set to run serially, it must run alone.
+ //Also, if processors setting is set higher than the -j
+ //setting, we default to using all of the process slots.
+ if(this->Properties[test]->RunSerial
+ || processors > this->ParallelLevel)
+ {
+ processors = this->ParallelLevel;
+ }
+
+ return processors;
+}
+
bool cmCTestMultiProcessHandler::StartTest(int test)
{
// copy the depend tests locally because when
@@ -160,7 +178,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
void cmCTestMultiProcessHandler::StartNextTests()
{
- size_t numToStart = this->ParallelLevel - this->RunningTests.size();
+ size_t numToStart = this->ParallelLevel - this->RunningCount;
if(numToStart == 0)
{
return;
@@ -171,13 +189,16 @@ void cmCTestMultiProcessHandler::StartNextTests()
for(TestMap::iterator i = tests.begin();
i != tests.end(); ++i)
{
- //int processors = this->Properties[i->first]->Processors;
-
-// if(processors > )
+ size_t processors = GetProcessorsUsed(i->first);
+ if(processors > numToStart)
+ {
+ return;
+ }
// start test should start only one test
if(this->StartTest(i->first))
{
- numToStart--;
+ numToStart -= processors;
+ this->RunningCount += processors;
}
else
{
@@ -241,7 +262,7 @@ bool cmCTestMultiProcessHandler::CheckOutput()
this->TestRunningMap[test] = false;
this->RunningTests.erase(p);
this->WriteCheckpoint(test);
-
+ this->RunningCount -= GetProcessorsUsed(test);
delete p;
}
return true;
diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h
index 9c63be7..5d0ae46 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.h
+++ b/Source/CTest/cmCTestMultiProcessHandler.h
@@ -80,6 +80,7 @@ protected:
//Check if we need to resume an interrupted test set
void CheckResume();
int FindMaxIndex();
+ inline size_t GetProcessorsUsed(int index);
// map from test number to set of depend tests
TestMap Tests;
TestMap ExpensiveTests;
@@ -87,6 +88,7 @@ protected:
size_t Total;
//Number of tests that are complete
size_t Completed;
+ size_t RunningCount;
//list of test properties (indices concurrent to the test map)
PropertiesMap Properties;
std::map<int, bool> TestRunningMap;
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index d471c6c..0e8d404 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -476,7 +476,7 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
cmCTestLog(this->CTest, HANDLER_OUTPUT, " ");
const int maxTestNameWidth = this->CTest->GetMaxTestNameWidth();
std::string outname = this->TestProperties->Name + " ";
- outname.resize(maxTestNameWidth, '.');
+ outname.resize(maxTestNameWidth + 4, '.');
*this->TestHandler->LogFile << this->TestProperties->Index << "/"
<< this->TestHandler->TotalNumberOfTests << " Testing: "
diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx
index d57bfa5..6ae227b 100644
--- a/Source/CTest/cmCTestTestHandler.cxx
+++ b/Source/CTest/cmCTestTestHandler.cxx
@@ -1979,6 +1979,10 @@ bool cmCTestTestHandler::SetTestsProperties(
{
rtit->Expensive = cmSystemTools::IsOn(val.c_str());
}
+ if ( key == "RUN_SERIAL" )
+ {
+ rtit->RunSerial = cmSystemTools::IsOn(val.c_str());
+ }
if ( key == "FAIL_REGULAR_EXPRESSION" )
{
std::vector<std::string> lval;
@@ -2127,6 +2131,7 @@ bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
test.IsInBasedOnREOptions = true;
test.WillFail = false;
test.Expensive = false;
+ test.RunSerial = false;
test.Timeout = 0;
test.Processors = 1;
if (this->UseIncludeRegExpFlag &&
diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h
index e4b5e07..113c1c9 100644
--- a/Source/CTest/cmCTestTestHandler.h
+++ b/Source/CTest/cmCTestTestHandler.h
@@ -97,6 +97,7 @@ public:
bool IsInBasedOnREOptions;
bool WillFail;
bool Expensive;
+ bool RunSerial;
double Timeout;
int Index;
//Requested number of process slots
diff --git a/Source/cmSetTestsPropertiesCommand.h b/Source/cmSetTestsPropertiesCommand.h
index f93d9dc..c975011 100644
--- a/Source/cmSetTestsPropertiesCommand.h
+++ b/Source/cmSetTestsPropertiesCommand.h
@@ -73,7 +73,10 @@ public:
"require. This is typically used for MPI tests, and should be used in "
"conjunction with the ctest_test PARALLEL_LEVEL option.\n"
"EXPENSIVE: If set to true, this test will be run before tests that "
- "are not marked as expensive. This should be used in conjunction with "
+ "are not marked as expensive. This should be used in conjunction with "
+ "the ctest_test PARALLEL_LEVEL option.\n"
+ "RUN_SERIAL: If set to true, this test will not run in parallel with "
+ "any other tests. This should be used in conjunction with "
"the ctest_test PARALLEL_LEVEL option.\n";
}