view doodle/core/backtrace.d @ 103:345fb56d89fc

Blind checkpoint
author David Bryant <bagnose@gmail.com>
date Thu, 18 Nov 2010 12:00:02 +1030
parents 100dd23c7bdf
children 7abaf5c3959f
line wrap: on
line source

module doodle.core.backtrace;

//
// Register signal handlers and throw Error.
// Technically we shouldn't be throwing an exception from
// a signal handler, but it happens to work.
//

private {
    import core.stdc.signal;
    import std.string;

    // signal handler for otherwise-fatal thread-specific signals 
    extern (C) void signalHandler(int sig) {
        string name() {
            switch (sig) {
            case SIGSEGV: return "SIGSEGV";
            case SIGFPE:  return "SIGFPE";
            case SIGILL:  return "SIGILL";
            case SIGABRT: return "SIGABRT";
            case SIGINT:  return "SIGINT";
            default:      return "";
            }
        }

        throw new Error(format("Got signal %s %s", sig, name));
    }

    shared static this() {
        // set up shared signal handlers for fatal thread-specific signals
        signal(SIGABRT, &signalHandler);
        signal(SIGFPE,  &signalHandler);
        signal(SIGILL,  &signalHandler);
        signal(SIGSEGV, &signalHandler);
        signal(SIGINT,  &signalHandler);
    }
}