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>
This commit is contained in:
Thomas Wood 2014-05-12 10:19:52 +01:00
parent 5597a1f418
commit d8e5313a27
2 changed files with 43 additions and 3 deletions

View File

@ -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);
}

View File

@ -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 */