diff options
author | 2017-07-26 08:51:43 -0400 | |
---|---|---|
committer | 2017-07-26 13:19:49 +0000 | |
commit | 9ac801c12c48b67b48e5a8ef2876a093b7de73fc (patch) | |
tree | 542b3c4798c0a219571adecd66866bb4f5a2ebd1 /tools | |
parent | bb2c14e4b702c4399409706f8291f50d63677951 (diff) |
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/ok.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/tools/ok.cpp b/tools/ok.cpp index edda9bede0..8d24b4ddcb 100644 --- a/tools/ok.cpp +++ b/tools/ok.cpp @@ -69,13 +69,14 @@ static thread_local const char* tls_currently_running = ""; 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 @@ static thread_local const char* tls_currently_running = ""; #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 ThreadEngine : Engine { 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 @@ int main(int argc, char** argv) { update_stats(s); } printf("\n"); + print_deferred_logs(); return (failed || crashed) ? 1 : 0; } |