From f7c036a8018213d3b8ce3fe36fdceeb633c00c54 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Mon, 22 Jun 2020 08:50:50 -0700 Subject: [PATCH] test-runner: use WNOHANG option waiting for PID If an application has a bug and hangs on SIGTERM this causes test-runner to hang as well. This is obviously an issue with the application in question, but test-runner should have a way of continuing onto the next test rather than hanging. Instead we can use WNOHANG and a sleep to allow applications some amount of time to exit, and if they haven't use SIGKILL instead as well as print an error. Similar to how wait_for_socket works. The timeout is hard coded to 2 seconds (100ms sleep + 20 iterations). --- tools/test-runner.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/test-runner.c b/tools/test-runner.c index e5059f54..232c0ba8 100644 --- a/tools/test-runner.c +++ b/tools/test-runner.c @@ -624,14 +624,24 @@ exit: static void kill_process(pid_t pid) { int status; + int i = 0; l_debug("Terminate pid: %d", pid); kill(pid, SIGTERM); do { - waitpid(pid, &status, 0); - } while (!WIFEXITED(status) && !WIFSIGNALED(status)); + if (waitpid(pid, &status, WNOHANG) == pid) + return; + + usleep(100000); + } while (!WIFEXITED(status) && !WIFSIGNALED(status) && i++ < 20); + + l_error("Failed to kill process %d gracefully", pid); + kill(pid, SIGKILL); + + /* SIGKILL shouldn't need WNOHANG */ + waitpid(pid, &status, 0); } static bool wait_for_socket(const char *socket, useconds_t wait_time)