1111
1212#include " gtest/gtest.h"
1313
14+ #include < condition_variable>
1415#include < io.h>
1516#include < signal.h>
17+ #include < thread>
1618
1719std::string lastTest (" " );
1820static int newStdOut = -1 ;
1921
22+ namespace NEO {
23+ extern const char *executionName;
24+ extern unsigned int ultIterationMaxTime;
25+ } // namespace NEO
26+
27+ std::unique_ptr<std::thread> alarmThread;
28+
2029LONG WINAPI ultExceptionFilter (
2130 _In_ struct _EXCEPTION_POINTERS *exceptionInfo) {
2231 std::cout << " UnhandledException: 0x" << std::hex << exceptionInfo->ExceptionRecord ->ExceptionCode << std::dec
@@ -49,9 +58,48 @@ int setAbrt(bool enableAbrt) {
4958}
5059
5160int setAlarm (bool enableAlarm) {
61+ std::cout << " enable SIGALRM handler: " << enableAlarm << std::endl;
62+
63+ if (enableAlarm) {
64+ std::string envVar = std::string (" NEO_" ) + NEO::executionName + " _DISABLE_TEST_ALARM" ;
65+ char *envValue = getenv (envVar.c_str ());
66+ if (envValue != nullptr ) {
67+ enableAlarm = false ;
68+ std::cout << " WARNING: SIGALRM handler disabled by environment variable: " << envVar << std::endl;
69+ }
70+ }
71+
72+ if (enableAlarm) {
73+ std::condition_variable threadStarted;
74+ alarmThread = std::make_unique<std::thread>([&]() {
75+ auto currentUltIterationMaxTime = NEO::ultIterationMaxTime;
76+ auto ultIterationMaxTimeEnv = getenv (" NEO_ULT_ITERATION_MAX_TIME" );
77+ if (ultIterationMaxTimeEnv != nullptr ) {
78+ currentUltIterationMaxTime = atoi (ultIterationMaxTimeEnv);
79+ }
80+ unsigned int alarmTime = currentUltIterationMaxTime * ::testing::GTEST_FLAG (repeat);
81+ std::cout << " set timeout to: " << alarmTime << std::endl;
82+ threadStarted.notify_all ();
83+ std::this_thread::sleep_for (std::chrono::seconds (alarmTime));
84+ printf (" timeout on %s\n " , lastTest.c_str ());
85+ abort ();
86+ });
87+
88+ std::mutex mtx;
89+ std::unique_lock<std::mutex> lock (mtx);
90+ threadStarted.wait (lock);
91+ }
92+
5293 return 0 ;
5394}
5495
5596int setSegv (bool enableSegv) {
5697 return 0 ;
5798}
99+
100+ void cleanupSignals () {
101+ if (alarmThread) {
102+ alarmThread->detach ();
103+ alarmThread.reset ();
104+ }
105+ }
0 commit comments