2009-10-02 01:21:28 +04:00
|
|
|
/*============================================================================
|
|
|
|
CMake - Cross Platform Makefile Generator
|
|
|
|
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
|
2008-07-03 17:31:33 +04:00
|
|
|
|
2009-10-02 01:21:28 +04:00
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
|
|
see accompanying file Copyright.txt for details.
|
2008-07-03 17:31:33 +04:00
|
|
|
|
2009-10-02 01:21:28 +04:00
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the License for more information.
|
|
|
|
============================================================================*/
|
2008-07-03 17:31:33 +04:00
|
|
|
#ifndef cmCTestMultiProcessHandler_h
|
|
|
|
#define cmCTestMultiProcessHandler_h
|
|
|
|
|
|
|
|
#include <cmStandardIncludes.h>
|
|
|
|
#include <cmCTestTestHandler.h>
|
2009-08-26 20:09:06 +04:00
|
|
|
#include <cmCTestRunTest.h>
|
2008-07-03 17:31:33 +04:00
|
|
|
|
|
|
|
/** \class cmCTestMultiProcessHandler
|
|
|
|
* \brief run parallel ctest
|
|
|
|
*
|
|
|
|
* cmCTestMultiProcessHandler
|
|
|
|
*/
|
|
|
|
class cmCTestMultiProcessHandler
|
|
|
|
{
|
|
|
|
public:
|
2008-07-04 18:28:22 +04:00
|
|
|
struct TestSet : public std::set<int> {};
|
|
|
|
struct TestMap : public std::map<int, TestSet> {};
|
2009-09-08 21:39:13 +04:00
|
|
|
struct TestCostMap : public std::map<float, TestSet> {};
|
2009-08-26 20:09:06 +04:00
|
|
|
struct PropertiesMap : public
|
|
|
|
std::map<int, cmCTestTestHandler::cmCTestTestProperties*> {};
|
|
|
|
|
2008-07-03 17:31:33 +04:00
|
|
|
cmCTestMultiProcessHandler();
|
2009-09-10 19:16:08 +04:00
|
|
|
virtual ~cmCTestMultiProcessHandler();
|
2008-07-03 17:31:33 +04:00
|
|
|
// Set the tests
|
2009-09-09 01:10:35 +04:00
|
|
|
void SetTests(TestMap& tests, PropertiesMap& properties);
|
2008-07-03 17:31:33 +04:00
|
|
|
// Set the max number of tests that can be run at the same time.
|
|
|
|
void SetParallelLevel(size_t);
|
2009-09-10 19:16:08 +04:00
|
|
|
virtual void RunTests();
|
2009-08-28 19:08:39 +04:00
|
|
|
void PrintTestList();
|
2009-09-02 18:08:40 +04:00
|
|
|
|
2008-07-03 17:31:33 +04:00
|
|
|
void SetPassFailVectors(std::vector<cmStdString>* passed,
|
|
|
|
std::vector<cmStdString>* failed)
|
|
|
|
{
|
2009-09-02 18:08:40 +04:00
|
|
|
this->Passed = passed;
|
|
|
|
this->Failed = failed;
|
2008-07-03 17:31:33 +04:00
|
|
|
}
|
|
|
|
void SetTestResults(std::vector<cmCTestTestHandler::cmCTestTestResult>* r)
|
2009-09-08 21:39:13 +04:00
|
|
|
{ this->TestResults = r; }
|
2009-08-26 20:09:06 +04:00
|
|
|
|
2008-07-03 17:31:33 +04:00
|
|
|
void SetCTest(cmCTest* ctest) { this->CTest = ctest;}
|
2009-08-26 20:09:06 +04:00
|
|
|
|
|
|
|
void SetTestHandler(cmCTestTestHandler * handler)
|
|
|
|
{ this->TestHandler = handler; }
|
|
|
|
|
|
|
|
cmCTestTestHandler * GetTestHandler()
|
|
|
|
{ return this->TestHandler; }
|
2008-07-03 17:31:33 +04:00
|
|
|
protected:
|
|
|
|
cmCTest* CTest;
|
|
|
|
// Start the next test or tests as many as are allowed by
|
|
|
|
// ParallelLevel
|
|
|
|
void StartNextTests();
|
|
|
|
void StartTestProcess(int test);
|
|
|
|
bool StartTest(int test);
|
2009-08-27 18:37:30 +04:00
|
|
|
// Mark the checkpoint for the given test
|
|
|
|
void WriteCheckpoint(int index);
|
2009-09-09 01:10:35 +04:00
|
|
|
void WriteCostData(int index, float cost);
|
|
|
|
void ReadCostData();
|
|
|
|
void CreateTestCostList();
|
2009-08-27 18:37:30 +04:00
|
|
|
// Removes the checkpoint file
|
|
|
|
void MarkFinished();
|
2009-09-08 21:39:13 +04:00
|
|
|
void EraseTest(int index);
|
2008-07-03 17:31:33 +04:00
|
|
|
// Return true if there are still tests running
|
|
|
|
// check all running processes for output and exit case
|
|
|
|
bool CheckOutput();
|
2009-08-27 18:37:30 +04:00
|
|
|
void RemoveTest(int index);
|
|
|
|
//Check if we need to resume an interrupted test set
|
|
|
|
void CheckResume();
|
2009-11-04 01:25:20 +03:00
|
|
|
//Check if there are any circular dependencies
|
|
|
|
bool CheckCycles();
|
2009-09-02 18:08:40 +04:00
|
|
|
int FindMaxIndex();
|
2009-09-07 18:26:17 +04:00
|
|
|
inline size_t GetProcessorsUsed(int index);
|
2008-07-03 17:31:33 +04:00
|
|
|
// map from test number to set of depend tests
|
2008-07-04 18:28:22 +04:00
|
|
|
TestMap Tests;
|
2009-09-08 21:39:13 +04:00
|
|
|
TestCostMap TestCosts;
|
2009-08-28 19:08:39 +04:00
|
|
|
//Total number of tests we'll be running
|
2009-08-31 17:50:35 +04:00
|
|
|
size_t Total;
|
2009-08-28 19:08:39 +04:00
|
|
|
//Number of tests that are complete
|
2009-08-31 17:50:35 +04:00
|
|
|
size_t Completed;
|
2009-09-07 18:26:17 +04:00
|
|
|
size_t RunningCount;
|
2009-08-26 20:09:06 +04:00
|
|
|
//list of test properties (indices concurrent to the test map)
|
|
|
|
PropertiesMap Properties;
|
2008-07-03 17:31:33 +04:00
|
|
|
std::map<int, bool> TestRunningMap;
|
|
|
|
std::map<int, bool> TestFinishMap;
|
|
|
|
std::map<int, cmStdString> TestOutput;
|
|
|
|
std::vector<cmStdString>* Passed;
|
|
|
|
std::vector<cmStdString>* Failed;
|
|
|
|
std::vector<cmCTestTestHandler::cmCTestTestResult>* TestResults;
|
|
|
|
size_t ParallelLevel; // max number of process that can be run at once
|
2009-08-26 20:09:06 +04:00
|
|
|
std::set<cmCTestRunTest*> RunningTests; // current running tests
|
|
|
|
cmCTestTestHandler * TestHandler;
|
2008-07-03 17:31:33 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|