diff options
-rw-r--r-- | Source/CTest/cmCTestBuildHandler.cxx | 6 | ||||
-rw-r--r-- | Source/CTest/cmCTestCoverageHandler.cxx | 6 | ||||
-rw-r--r-- | Source/CTest/cmCTestScriptHandler.cxx | 21 | ||||
-rw-r--r-- | Source/CTest/cmCTestScriptHandler.h | 7 | ||||
-rw-r--r-- | Source/CTest/cmCTestTestHandler.cxx | 8 | ||||
-rw-r--r-- | Source/cmCTest.cxx | 44 | ||||
-rw-r--r-- | Source/cmCTest.h | 7 |
7 files changed, 93 insertions, 6 deletions
diff --git a/Source/CTest/cmCTestBuildHandler.cxx b/Source/CTest/cmCTestBuildHandler.cxx index 47c708b..e0d7c84 100644 --- a/Source/CTest/cmCTestBuildHandler.cxx +++ b/Source/CTest/cmCTestBuildHandler.cxx @@ -250,6 +250,12 @@ int cmCTestBuildHandler::ProcessHandler() { cmCTestLog(this->CTest, HANDLER_OUTPUT, "Build project" << std::endl); + // do we have time for this + if (this->CTest->GetRemainingTimeAllowed() < 120) + { + return 0; + } + int entry; for ( entry = 0; cmCTestWarningErrorFileLine[entry].RegularExpressionString; diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx index 8a0dad8..b0dee01 100644 --- a/Source/CTest/cmCTestCoverageHandler.cxx +++ b/Source/CTest/cmCTestCoverageHandler.cxx @@ -180,6 +180,12 @@ int cmCTestCoverageHandler::ProcessHandler() { int error = 0; + // do we have time for this + if (this->CTest->GetRemainingTimeAllowed() < 120) + { + return error; + } + std::string sourceDir = this->CTest->GetCTestConfiguration("SourceDirectory"); std::string binaryDir diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx index 905a40b..0346e43 100644 --- a/Source/CTest/cmCTestScriptHandler.cxx +++ b/Source/CTest/cmCTestScriptHandler.cxx @@ -965,3 +965,24 @@ bool cmCTestScriptHandler::EmptyBinaryDirectory(const char *sname) } return true; } + +//------------------------------------------------------------------------- +double cmCTestScriptHandler::GetRemainingTimeAllowed() +{ + if (!this->Makefile) + { + return 1.0e7; + } + + const char *timelimitS + = this->Makefile->GetDefinition("CTEST_TIME_LIMIT"); + + if (!timelimitS) + { + return 1.0e7; + } + + double timelimit = atof(timelimitS); + + return timelimit - cmSystemTools::GetTime() + this->ScriptStartTime; +} diff --git a/Source/CTest/cmCTestScriptHandler.h b/Source/CTest/cmCTestScriptHandler.h index 503ddcc..f82f3ea 100644 --- a/Source/CTest/cmCTestScriptHandler.h +++ b/Source/CTest/cmCTestScriptHandler.h @@ -96,6 +96,13 @@ public: static void SleepInSeconds(unsigned int secondsToWait); void UpdateElapsedTime(); + /** + * Return the time remaianing that the script is allowed to run in + * seconds if the user has set the variable CTEST_TIME_LIMIT. If that has + * not been set it returns 1e7 seconds + */ + double GetRemainingTimeAllowed(); + cmCTestScriptHandler(); ~cmCTestScriptHandler(); diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index c1a8dc8..fef7e42 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -605,6 +605,14 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed, { inREcnt++; } + + // if we are out of time then skip this test, we leave two minutes + // to submit results + if (this->CTest->GetRemainingTimeAllowed() - 120 <= 0) + { + continue; + } + const std::string& testname = it->Name; std::vector<std::string>& args = it->Args; cmCTestTestResult cres; diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 8fa576c..8d05762 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -792,7 +792,8 @@ int cmCTest::ProcessTests() break; } } - if ( this->Tests[UPDATE_TEST] || this->Tests[ALL_TEST] ) + if (( this->Tests[UPDATE_TEST] || this->Tests[ALL_TEST] ) && + (this->GetRemainingTimeAllowed() - 120 > 0)) { cmCTestGenericHandler* uphandler = this->GetHandler("update"); uphandler->SetPersistentOption("SourceDirectory", @@ -807,14 +808,16 @@ int cmCTest::ProcessTests() { return 0; } - if ( this->Tests[CONFIGURE_TEST] || this->Tests[ALL_TEST] ) + if (( this->Tests[CONFIGURE_TEST] || this->Tests[ALL_TEST] )&& + (this->GetRemainingTimeAllowed() - 120 > 0)) { if (this->GetHandler("configure")->ProcessHandler() < 0) { res |= cmCTest::CONFIGURE_ERRORS; } } - if ( this->Tests[BUILD_TEST] || this->Tests[ALL_TEST] ) + if (( this->Tests[BUILD_TEST] || this->Tests[ALL_TEST] )&& + (this->GetRemainingTimeAllowed() - 120 > 0)) { this->UpdateCTestConfiguration(); if (this->GetHandler("build")->ProcessHandler() < 0) @@ -822,7 +825,8 @@ int cmCTest::ProcessTests() res |= cmCTest::BUILD_ERRORS; } } - if ( this->Tests[TEST_TEST] || this->Tests[ALL_TEST] || notest ) + if (( this->Tests[TEST_TEST] || this->Tests[ALL_TEST] || notest ) && + (this->GetRemainingTimeAllowed() - 120 > 0)) { this->UpdateCTestConfiguration(); if (this->GetHandler("test")->ProcessHandler() < 0) @@ -830,7 +834,8 @@ int cmCTest::ProcessTests() res |= cmCTest::TEST_ERRORS; } } - if ( this->Tests[COVERAGE_TEST] || this->Tests[ALL_TEST] ) + if (( this->Tests[COVERAGE_TEST] || this->Tests[ALL_TEST] ) && + (this->GetRemainingTimeAllowed() - 120 > 0)) { this->UpdateCTestConfiguration(); if (this->GetHandler("coverage")->ProcessHandler() < 0) @@ -838,7 +843,8 @@ int cmCTest::ProcessTests() res |= cmCTest::COVERAGE_ERRORS; } } - if ( this->Tests[MEMCHECK_TEST] || this->Tests[ALL_TEST] ) + if (( this->Tests[MEMCHECK_TEST] || this->Tests[ALL_TEST] )&& + (this->GetRemainingTimeAllowed() - 120 > 0)) { this->UpdateCTestConfiguration(); if (this->GetHandler("memcheck")->ProcessHandler() < 0) @@ -1109,6 +1115,19 @@ int cmCTest::RunTest(std::vector<const char*> argv, { cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1); } + + // do we have time for + double timeout = this->GetRemainingTimeAllowed() - 120; + if (this->TimeOut && this->TimeOut < timeout) + { + timeout = this->TimeOut; + } + // always have at least 1 second if we got to here + if (timeout <= 0) + { + timeout = 1; + } + cmsysProcess_SetTimeout(cp, this->TimeOut); cmsysProcess_Execute(cp); @@ -2547,3 +2566,16 @@ void cmCTest::Log(int logType, const char* file, int line, const char* msg) } } +//------------------------------------------------------------------------- +double cmCTest::GetRemainingTimeAllowed() +{ + if (!this->GetHandler("script")) + { + return 1.0e7; + } + + cmCTestScriptHandler* ch + = static_cast<cmCTestScriptHandler*>(this->GetHandler("script")); + + return ch->GetRemainingTimeAllowed(); +} diff --git a/Source/cmCTest.h b/Source/cmCTest.h index 962431a..ca2e1a9 100644 --- a/Source/cmCTest.h +++ b/Source/cmCTest.h @@ -137,6 +137,13 @@ public: ///! Get the current time as string std::string CurrentTime(); + /** + * Return the time remaianing that the script is allowed to run in + * seconds if the user has set the variable CTEST_TIME_LIMIT. If that has + * not been set it returns 1e7 seconds + */ + double GetRemainingTimeAllowed(); + ///! Open file in the output directory and set the stream bool OpenOutputFile(const std::string& path, const std::string& name, |