Commit 937df2ef authored by Daniel Vetter's avatar Daniel Vetter

lib: Make sure we leak no child processes

There's a lot more ways to leak children than igt_fork, some even
handrolled. So check for that. Also have a nice littel testcase for
that too.

v2: Don't hang if there's a leaked child process (Chris). Has the
added benefit that my library unit test also gets faster!

v3: Rebase.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson's avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter's avatarDaniel Vetter <daniel.vetter@intel.com>
parent fee7466a
......@@ -1492,6 +1492,8 @@ void __igt_fail_assert(const char *domain, const char *file, const int line,
*/
void igt_exit(void)
{
int tmp;
igt_exit_called = true;
if (igt_key_file)
......@@ -1527,6 +1529,8 @@ void igt_exit(void)
kill(test_children[c], SIGKILL);
assert(!num_test_children);
assert(waitpid(-1, &tmp, WNOHANG) == -1 && errno == ECHILD);
if (!test_with_subtests) {
struct timespec now;
const char *result;
......
......@@ -68,6 +68,20 @@ static void igt_fork_leak(void)
}
}
static void plain_fork_leak(void)
{
int pid;
switch (pid = fork()) {
case -1:
internal_assert(0);
case 0:
sleep(1);
default:
exit(0);
}
}
static void igt_fork_timeout_leak(void)
{
igt_fork(i, 1) {
......@@ -119,4 +133,8 @@ int main(int argc, char **argv)
/* check that igt_waitchildren_timeout cleans up*/
ret = do_fork(igt_fork_timeout_leak);
internal_assert(WEXITSTATUS(ret) == SIGKILL + 128);
/* check that any other process leaks are caught*/
ret = do_fork(plain_fork_leak);
internal_assert(WTERMSIG(ret) == SIGABRT);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment