summaryrefslogtreecommitdiff
path: root/runner
diff options
context:
space:
mode:
Diffstat (limited to 'runner')
-rw-r--r--runner/executor.c31
-rw-r--r--runner/resultgen.c10
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) {