diff options
author | Thomas Wood <thomas.wood@intel.com> | 2014-05-12 10:19:52 +0100 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2014-05-14 12:33:01 +0100 |
commit | d8e5313a276c856fdd6f600e69e26f45e4c370c0 (patch) | |
tree | a66c8ae4b9f23346514e45eb096afc98f9fe5d93 /lib | |
parent | 5597a1f418f925f7cb298d3f74aab5ebdb0edd36 (diff) |
lib: add igt_set_timeout
Add a function to stop and fail a test after the specified number of
seconds have elapsed.
Signed-off-by: Thomas Wood <thomas.wood@intel.com>
Acked-by: Damien Lespiau <damien.lespiau@intel.com>
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 */ |