annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
1 module doodle.core.backtrace;
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
2
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
3 //
103
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 88
diff changeset
4 // Register signal handlers and throw Error.
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 88
diff changeset
5 // Technically we shouldn't be throwing an exception from
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 88
diff changeset
6 // a signal handler, but it happens to work.
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
7 //
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
8
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
9 private {
50
dfa1e219eafe New version of backtrace based on the one in druntime.
daveb
parents: 45
diff changeset
10 import core.stdc.signal;
dfa1e219eafe New version of backtrace based on the one in druntime.
daveb
parents: 45
diff changeset
11 import std.string;
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
12
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
13 // signal handler for otherwise-fatal thread-specific signals
66
43cc2135ced0 Some code cleanups
"David Bryant <bagnose@gmail.com>"
parents: 50
diff changeset
14 extern (C) void signalHandler(int sig) {
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
15 string name() {
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
16 switch (sig) {
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
17 case SIGSEGV: return "SIGSEGV";
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
18 case SIGFPE: return "SIGFPE";
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
19 case SIGILL: return "SIGILL";
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
20 case SIGABRT: return "SIGABRT";
88
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 66
diff changeset
21 case SIGINT: return "SIGINT";
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
22 default: return "";
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
23 }
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
24 }
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
25
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
26 throw new Error(format("Got signal %s %s", sig, name));
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
27 }
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
28
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
29 shared static this() {
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
30 // set up shared signal handlers for fatal thread-specific signals
66
43cc2135ced0 Some code cleanups
"David Bryant <bagnose@gmail.com>"
parents: 50
diff changeset
31 signal(SIGABRT, &signalHandler);
43cc2135ced0 Some code cleanups
"David Bryant <bagnose@gmail.com>"
parents: 50
diff changeset
32 signal(SIGFPE, &signalHandler);
43cc2135ced0 Some code cleanups
"David Bryant <bagnose@gmail.com>"
parents: 50
diff changeset
33 signal(SIGILL, &signalHandler);
43cc2135ced0 Some code cleanups
"David Bryant <bagnose@gmail.com>"
parents: 50
diff changeset
34 signal(SIGSEGV, &signalHandler);
103
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 88
diff changeset
35 signal(SIGINT, &signalHandler);
50
dfa1e219eafe New version of backtrace based on the one in druntime.
daveb
parents: 45
diff changeset
36 }
44
2b9329ed0f0e Added backtrace support
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
37 }