summaryrefslogtreecommitdiffstats
path: root/Source/CTest/cmCTestMultiProcessHandler.cxx
diff options
context:
space:
mode:
authorZach Mullen <zach.mullen@kitware.com>2010-03-02 20:34:37 (GMT)
committerZach Mullen <zach.mullen@kitware.com>2010-03-02 20:38:02 (GMT)
commit767ffba8ff37ccb510707b768086cb189970d8c6 (patch)
tree64f088977d94731b9a2a34416d806f4dcd38cfae /Source/CTest/cmCTestMultiProcessHandler.cxx
parent634c3113ed53cd05230e7c6418e6f9c5b5e630b2 (diff)
downloadCMake-767ffba8ff37ccb510707b768086cb189970d8c6.zip
CMake-767ffba8ff37ccb510707b768086cb189970d8c6.tar.gz
CMake-767ffba8ff37ccb510707b768086cb189970d8c6.tar.bz2
Added RESOURCE_LOCK test property.
Diffstat (limited to 'Source/CTest/cmCTestMultiProcessHandler.cxx')
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.cxx36
1 files changed, 35 insertions, 1 deletions
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 9d76dd4..84df303 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -95,12 +95,16 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
std::string current_dir = cmSystemTools::GetCurrentWorkingDirectory();
cmSystemTools::ChangeDirectory(this->Properties[test]->Directory.c_str());
+ // Lock the resources we'll be using
+ this->LockResources(test);
+
if(testRun->StartTest(this->Total))
{
this->RunningTests.insert(testRun);
}
else
{
+ this->UnlockResources(test);
this->Completed++;
this->TestFinishMap[test] = true;
this->TestRunningMap[test] = false;
@@ -113,6 +117,25 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
}
//---------------------------------------------------------
+void cmCTestMultiProcessHandler::LockResources(int index)
+{
+ this->LockedResources.insert(
+ this->Properties[index]->LockedResources.begin(),
+ this->Properties[index]->LockedResources.end());
+}
+
+//---------------------------------------------------------
+void cmCTestMultiProcessHandler::UnlockResources(int index)
+{
+ for(std::set<std::string>::iterator i =
+ this->Properties[index]->LockedResources.begin();
+ i != this->Properties[index]->LockedResources.end(); ++i)
+ {
+ this->LockedResources.erase(*i);
+ }
+}
+
+//---------------------------------------------------------
void cmCTestMultiProcessHandler::EraseTest(int test)
{
this->Tests.erase(test);
@@ -146,6 +169,17 @@ inline size_t cmCTestMultiProcessHandler::GetProcessorsUsed(int test)
//---------------------------------------------------------
bool cmCTestMultiProcessHandler::StartTest(int test)
{
+ //Check for locked resources
+ for(std::set<std::string>::iterator i =
+ this->Properties[test]->LockedResources.begin();
+ i != this->Properties[test]->LockedResources.end(); ++i)
+ {
+ if(this->LockedResources.find(*i) != this->LockedResources.end())
+ {
+ return false;
+ }
+ }
+
// copy the depend tests locally because when
// a test is finished it will be removed from the depend list
// and we don't want to be iterating a list while removing from it
@@ -274,7 +308,7 @@ bool cmCTestMultiProcessHandler::CheckOutput()
this->TestRunningMap[test] = false;
this->RunningTests.erase(p);
this->WriteCheckpoint(test);
-
+ this->UnlockResources(test);
this->RunningCount -= GetProcessorsUsed(test);
delete p;
}