ok, exit() child processes instead of _exit()

We want the atexit() hook to print deferred logs (crash dumps, etc.) only when the main, parent process exits.  Ending the child processes with _exit() instead of exit() avoids calling atexit() hooks, but also global destructors.  This is more complex than we need: we can just print before main() exits.  Only the main, parent process gets there.

This now runs each child process' global destructors, which makes trace.json "work": we get a trace of whichever child process finishes last.  It's a start.

Change-Id: I0cc2b12592f0f79e73a43a160b9fd06dba1fee25
Reviewed-on: https://skia-review.googlesource.com/26800
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/tools/ok.cpp b/tools/ok.cpp
index edda9be..8d24b4d 100644
--- a/tools/ok.cpp
+++ b/tools/ok.cpp
@@ -69,13 +69,14 @@
 
     static void defer_logging() {
         log_fd = fileno(tmpfile());
-        atexit([] {
-            lseek(log_fd, 0, SEEK_SET);
-            char buf[1024];
-            while (size_t bytes = read(log_fd, buf, sizeof(buf))) {
-                write(2, buf, bytes);
-            }
-        });
+    }
+
+    static void print_deferred_logs() {
+        lseek(log_fd, 0, SEEK_SET);
+        char buf[1024];
+        while (size_t bytes = read(log_fd, buf, sizeof(buf))) {
+            write(2/*stderr*/, buf, bytes);
+        }
     }
 
     void ok_log(const char* msg) {
@@ -91,6 +92,7 @@
 #else
     static void setup_crash_handler() {}
     static void defer_logging() {}
+    static void print_deferred_logs() {}
 
     void ok_log(const char* msg) {
         fprintf(stderr, "%s\n", msg);
@@ -153,7 +155,7 @@
     struct ForkEngine : Engine {
         bool spawn(std::function<Status(void)> fn) override {
             switch (fork()) {
-                case  0: _exit((int)fn());
+                case  0: exit((int)fn());
                 case -1: return false;
                 default: return true;
             }
@@ -332,6 +334,7 @@
         update_stats(s);
     }
     printf("\n");
+    print_deferred_logs();
     return (failed || crashed) ? 1 : 0;
 }