From e58e4e1a7f854953f823dc5135d35f728f253f31 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Thu, 4 Apr 2019 14:24:14 +0100 Subject: [PATCH 3/3] utils: Ensure pipes are read after exit There was a race in the code where the pipes may not be read after the process has exited and data may be left behind in them. This change to ordering ensures the pipes are read after the exit code has been read meaning no data can be left behind and the logs should be complete. Signed-off-by: Richard Purdie Upstream-Status: Pending [code being tested] --- utils.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/utils.c b/utils.c index c5b3b8d..37e88ab 100644 --- a/utils.c +++ b/utils.c @@ -264,6 +264,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group, struct pollfd pfds[2]; struct timespec sentinel; clockid_t clock = CLOCK_MONOTONIC; + int looping = 1; int r; int status; @@ -281,9 +282,23 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group, *timeouted = 0; - while (1) { + while (looping) { waitflags = WNOHANG; + if (timeout >= 0) { + struct timespec time; + + clock_gettime(clock, &time); + if ((time.tv_sec - sentinel.tv_sec) > timeout) { + *timeouted = 1; + kill(-pid, SIGKILL); + waitflags = 0; + } + } + + if (waitpid(pid, &status, waitflags) == pid) + looping = 0; + r = poll(pfds, 2, WAIT_CHILD_POLL_TIMEOUT_MS); if (r > 0) { char buf[WAIT_CHILD_BUF_MAX_SIZE]; @@ -303,19 +318,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group, } clock_gettime(clock, &sentinel); - } else if (timeout >= 0) { - struct timespec time; - - clock_gettime(clock, &time); - if ((time.tv_sec - sentinel.tv_sec) > timeout) { - *timeouted = 1; - kill(-pid, SIGKILL); - waitflags = 0; - } } - - if (waitpid(pid, &status, waitflags) == pid) - break; } fflush(fps[0]); -- 2.17.1