When waiting for the forked tests, we can respond quicker to a failure
(such as oom) by waiting for any child to exit rather than waiting for
each child in order. Then when we see that a test failed, we can kill
all other children before aborting.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 lib/igt_core.c | 42 +++++++++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 11 deletions(-)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 7ac7ebe..e5dc78b 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -915,32 +915,52 @@ bool __igt_fork(void)
  */
 void igt_waitchildren(void)
 {
+       int err = 0;
+       int count;
+
        assert(!test_child);
 
-       for (int nc = 0; nc < num_test_children; nc++) {
+       count = 0;
+       while (count < num_test_children) {
                int status = -1;
-               while (waitpid(test_children[nc], &status, 0) == -1 &&
-                      errno == EINTR)
-                       ;
+               pid_t pid;
+               int c;
 
-               if (status != 0) {
+               pid = wait(&status);
+               if (pid == -1)
+                       continue;
+
+               for (c = 0; c < num_test_children; c++)
+                       if (pid == test_children[c])
+                               break;
+               if (c == num_test_children)
+                       continue;
+
+               if (err == 0 && status != 0) {
                        if (WIFEXITED(status)) {
                                printf("child %i failed with exit status %i\n",
-                                      nc, WEXITSTATUS(status));
-                               igt_fail(WEXITSTATUS(status));
+                                      c, WEXITSTATUS(status));
+                               err = WEXITSTATUS(status);
                        } else if (WIFSIGNALED(status)) {
                                printf("child %i died with signal %i, %s\n",
-                                      nc, WTERMSIG(status),
+                                      c, WTERMSIG(status),
                                       strsignal(WTERMSIG(status)));
-                               igt_fail(99);
+                               err = 128 + WTERMSIG(status);
                        } else {
-                               printf("Unhandled failure in child %i\n", nc);
-                               abort();
+                               printf("Unhandled failure [%d] in child %i\n", 
status, c);
+                               err = 256;
                        }
+
+                       for (c = 0; c < num_test_children; c++)
+                               kill(test_children[c], SIGKILL);
                }
+
+               count++;
        }
 
        num_test_children = 0;
+       if (err)
+               igt_fail(err);
 }
 
 /* exit handler code */
-- 
2.0.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to