diff options
Diffstat (limited to 'runner')
-rw-r--r-- | runner/executor.c | 31 | ||||
-rw-r--r-- | runner/resultgen.c | 10 |
2 files changed, 38 insertions, 3 deletions
diff --git a/runner/executor.c b/runner/executor.c index c1a0545a..3ca2d20a 100644 --- a/runner/executor.c +++ b/runner/executor.c @@ -1008,6 +1008,37 @@ static int monitor_output(pid_t child, get_cmdline(siginfo.ssi_pid, comm, sizeof(comm)), siginfo.ssi_pid, strsignal(siginfo.ssi_signo)); + + if (siginfo.ssi_signo == SIGHUP) { + /* + * If taken down with + * SIGHUP, arrange the + * current test to be + * marked as notrun + * instead of + * incomplete. For + * other signals we + * don't need to do + * anything, the lack + * of a completion + * marker of any kind + * in the logs will + * mark those tests as + * incomplete. Note + * that since we set + * 'aborting' to true + * we're going to skip + * all other journal + * writes later. + */ + + outf("Exiting gracefully, currently running test will have a 'notrun' result\n"); + dprintf(outputs[_F_JOURNAL], "%s%d (%.3fs)\n", + EXECUTOR_EXIT, + -SIGHUP, 0.0); + if (settings->sync) + fdatasync(outputs[_F_JOURNAL]); + } } aborting = true; diff --git a/runner/resultgen.c b/runner/resultgen.c index 46007803..8d0c6249 100644 --- a/runner/resultgen.c +++ b/runner/resultgen.c @@ -17,11 +17,13 @@ #include "executor.h" #include "output_strings.h" -#define INCOMPLETE_EXITCODE -1 +#define INCOMPLETE_EXITCODE -1234 +#define GRACEFUL_EXITCODE -SIGHUP _Static_assert(INCOMPLETE_EXITCODE != IGT_EXIT_SKIP, "exit code clash"); _Static_assert(INCOMPLETE_EXITCODE != IGT_EXIT_SUCCESS, "exit code clash"); _Static_assert(INCOMPLETE_EXITCODE != IGT_EXIT_INVALID, "exit code clash"); +_Static_assert(INCOMPLETE_EXITCODE != GRACEFUL_EXITCODE, "exit code clash"); struct subtest { @@ -1106,6 +1108,8 @@ static const char *result_from_exitcode(int exitcode) return "abort"; case INCOMPLETE_EXITCODE: return "incomplete"; + case GRACEFUL_EXITCODE: + return "notrun"; default: return "fail"; } @@ -1180,7 +1184,7 @@ static void fill_from_journal(int fd, } } - if (subtests->size && exitcode == IGT_EXIT_ABORT) { + if (subtests->size && (exitcode == IGT_EXIT_ABORT || exitcode == GRACEFUL_EXITCODE)) { char *last_subtest = subtests->subs[subtests->size - 1].name; char subtest_piglit_name[256]; struct json_object *subtest_obj; @@ -1188,7 +1192,7 @@ static void fill_from_journal(int fd, generate_piglit_name(entry->binary, last_subtest, subtest_piglit_name, sizeof(subtest_piglit_name)); subtest_obj = get_or_create_json_object(tests, subtest_piglit_name); - set_result(subtest_obj, "abort"); + set_result(subtest_obj, exitcode == IGT_EXIT_ABORT ? "abort" : "notrun"); } if (subtests->size == 0) { |