| Index: dm/DM.cpp
|
| diff --git a/dm/DM.cpp b/dm/DM.cpp
|
| index de99b6b3e226a688ac3f8c60477a4e9aef0fe941..9ddff282f386f6b2ec300454c8e1eb8829da682c 100644
|
| --- a/dm/DM.cpp
|
| +++ b/dm/DM.cpp
|
| @@ -164,13 +164,8 @@ static void print_status() {
|
| }
|
| }
|
|
|
| -// Yo dawg, I heard you like signals so I caught a signal in your
|
| -// signal handler so you can handle signals while you handle signals.
|
| -// Let's not get into that situation. Only print if we're the first ones to get a crash signal.
|
| -static std::atomic<bool> in_signal_handler{false};
|
| -
|
| #if defined(SK_BUILD_FOR_WIN32)
|
| - static LONG WINAPI handler(EXCEPTION_POINTERS* e) {
|
| + static LONG WINAPI crash_handler(EXCEPTION_POINTERS* e) {
|
| static const struct {
|
| const char* name;
|
| DWORD code;
|
| @@ -184,50 +179,55 @@ static std::atomic<bool> in_signal_handler{false};
|
| #undef _
|
| };
|
|
|
| - if (!in_signal_handler.exchange(true)) {
|
| - const DWORD code = e->ExceptionRecord->ExceptionCode;
|
| - info("\nCaught exception %u", code);
|
| - for (const auto& exception : kExceptions) {
|
| - if (exception.code == code) {
|
| - info(" %s", exception.name);
|
| - }
|
| + SkAutoTAcquire<SkSpinlock> lock(gMutex);
|
| +
|
| + const DWORD code = e->ExceptionRecord->ExceptionCode;
|
| + info("\nCaught exception %u", code);
|
| + for (const auto& exception : kExceptions) {
|
| + if (exception.code == code) {
|
| + info(" %s", exception.name);
|
| }
|
| - info("\n");
|
| - print_status();
|
| - fflush(stdout);
|
| }
|
| + info(", was running:\n");
|
| + for (auto& task : gRunning) {
|
| + info("\t%s\n", task.c_str());
|
| + }
|
| + fflush(stdout);
|
| +
|
| // Execute default exception handler... hopefully, exit.
|
| return EXCEPTION_EXECUTE_HANDLER;
|
| }
|
| - static void setup_crash_handler() { SetUnhandledExceptionFilter(handler); }
|
| + static void setup_crash_handler() { SetUnhandledExceptionFilter(crash_handler); }
|
|
|
| #elif !defined(SK_BUILD_FOR_ANDROID)
|
| #include <execinfo.h>
|
| #include <signal.h>
|
| #include <stdlib.h>
|
|
|
| + static void crash_handler(int sig) {
|
| + SkAutoTAcquire<SkSpinlock> lock(gMutex);
|
| +
|
| + info("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig));
|
| + for (auto& task : gRunning) {
|
| + info("\t%s\n", task.c_str());
|
| + }
|
| +
|
| + void* stack[64];
|
| + int count = backtrace(stack, SK_ARRAY_COUNT(stack));
|
| + char** symbols = backtrace_symbols(stack, count);
|
| + info("\nStack trace:\n");
|
| + for (int i = 0; i < count; i++) {
|
| + info(" %s\n", symbols[i]);
|
| + }
|
| + fflush(stdout);
|
| +
|
| + _Exit(sig);
|
| + }
|
| +
|
| static void setup_crash_handler() {
|
| const int kSignals[] = { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV };
|
| for (int sig : kSignals) {
|
| - signal(sig, [](int sig) {
|
| - if (!in_signal_handler.exchange(true)) {
|
| - SkAutoTAcquire<SkSpinlock> lock(gMutex);
|
| - info("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig));
|
| - for (auto& task : gRunning) {
|
| - info("\t%s\n", task.c_str());
|
| - }
|
| -
|
| - void* stack[64];
|
| - int count = backtrace(stack, SK_ARRAY_COUNT(stack));
|
| - char** symbols = backtrace_symbols(stack, count);
|
| - info("\nStack trace:\n");
|
| - for (int i = 0; i < count; i++) {
|
| - info(" %s\n", symbols[i]);
|
| - }
|
| - fflush(stdout);
|
| - }
|
| - _Exit(sig);
|
| - });
|
| + signal(sig, crash_handler);
|
| }
|
| }
|
|
|
|
|