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>
This commit is contained in:
parent
bb2c14e4b7
commit
9ac801c12c
19
tools/ok.cpp
19
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user