diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_core.c | 44 | ||||
-rw-r--r-- | lib/igt_core.h | 2 |
2 files changed, 43 insertions, 3 deletions
diff --git a/lib/igt_core.c b/lib/igt_core.c index a6aff803..54f87c0f 100644 --- a/lib/igt_core.c +++ b/lib/igt_core.c @@ -641,9 +641,12 @@ void igt_fail(int exitcode) if (test_child) exit(exitcode); - if (in_subtest) - exit_subtest("FAIL"); - else { + if (in_subtest) { + if (exitcode == 78) + exit_subtest("TIMEOUT"); + else + exit_subtest("FAIL"); + } else { assert(!test_with_subtests || in_fixture); if (in_fixture) { @@ -1224,3 +1227,38 @@ void igt_vlog(enum igt_log_level level, const char *format, va_list args) } else vprintf(format, args); } + +static void igt_alarm_handler(int signal) +{ + /* subsequent tests are skipped */ + skip_subtests_henceforth = SKIP; + + /* exit with status 78 to indicate timeout */ + igt_fail(78); +} + +/** + * igt_set_timeout: + * @seconds: number of seconds before timeout + * + * Stop the current test and skip any subsequent tests after the specified + * number of seconds have elapsed. The test will exit with "timeout" status + * (78). Any previous timer is cancelled and no timeout is scheduled if @seconds + * is zero. + * + */ +void igt_set_timeout(unsigned int seconds) +{ + struct sigaction sa; + + sa.sa_handler = igt_alarm_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + if (seconds == 0) + sigaction(SIGALRM, NULL, NULL); + else + sigaction(SIGALRM, &sa, NULL); + + alarm(seconds); +} diff --git a/lib/igt_core.h b/lib/igt_core.h index 7ede0d37..3a6ee1a4 100644 --- a/lib/igt_core.h +++ b/lib/igt_core.h @@ -465,4 +465,6 @@ extern enum igt_log_level igt_log_level; } while (0) +void igt_set_timeout(unsigned int seconds); + #endif /* IGT_CORE_H */ |