aboutsummaryrefslogtreecommitdiff
path: root/src/deps/backtrace.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/deps/backtrace.zig')
-rw-r--r--src/deps/backtrace.zig41
1 files changed, 15 insertions, 26 deletions
diff --git a/src/deps/backtrace.zig b/src/deps/backtrace.zig
index 3a5bc7a49..47293d1cf 100644
--- a/src/deps/backtrace.zig
+++ b/src/deps/backtrace.zig
@@ -94,17 +94,21 @@ pub inline fn print() void {
_ = backtrace_full(state, 2, full_callback, null, null);
}
+fn setup_sigactions(act: ?*const os.Sigaction) !void {
+ try os.sigaction(os.SIG.ABRT, act, null);
+ try os.sigaction(os.SIG.BUS, act, null);
+ try os.sigaction(os.SIG.FPE, act, null);
+ try os.sigaction(os.SIG.ILL, act, null);
+ try os.sigaction(os.SIG.SEGV, act, null);
+ try os.sigaction(os.SIG.TRAP, act, null);
+}
+
const builtin = @import("builtin");
const ErrorCallback = fn (sig: i32, addr: usize) void;
var on_error: ?ErrorCallback = null;
noinline fn sigaction_handler(sig: i32, info: *const std.os.siginfo_t, _: ?*const anyopaque) callconv(.C) void {
// Prevent recursive calls
- os.sigaction(os.SIG.ABRT, null, null);
- os.sigaction(os.SIG.BUS, null, null);
- os.sigaction(os.SIG.FPE, null, null);
- os.sigaction(os.SIG.ILL, null, null);
- os.sigaction(os.SIG.SEGV, null, null);
- os.sigaction(os.SIG.TRAP, null, null);
+ setup_sigactions(null) catch unreachable;
const addr = switch (comptime builtin.target.os.tag) {
.linux => @ptrToInt(info.fields.sigfault.addr),
@@ -117,13 +121,8 @@ noinline fn sigaction_handler(sig: i32, info: *const std.os.siginfo_t, _: ?*cons
if (on_error) |handle| handle(sig, addr);
}
-pub fn reloadHandlers() void {
- os.sigaction(os.SIG.ABRT, null, null);
- os.sigaction(os.SIG.BUS, null, null);
- os.sigaction(os.SIG.FPE, null, null);
- os.sigaction(os.SIG.ILL, null, null);
- os.sigaction(os.SIG.SEGV, null, null);
- os.sigaction(os.SIG.TRAP, null, null);
+pub fn reloadHandlers() !void {
+ try setup_sigactions(null);
var act = os.Sigaction{
.handler = .{ .sigaction = sigaction_handler },
@@ -131,15 +130,10 @@ pub fn reloadHandlers() void {
.flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND),
};
- os.sigaction(os.SIG.ABRT, &act, null);
- os.sigaction(os.SIG.BUS, &act, null);
- os.sigaction(os.SIG.FPE, &act, null);
- os.sigaction(os.SIG.ILL, &act, null);
- os.sigaction(os.SIG.SEGV, &act, null);
- os.sigaction(os.SIG.TRAP, &act, null);
+ try setup_sigactions(&act);
}
const os = std.os;
-pub fn start(ctx: ?*anyopaque, callback_: PrintCallback, onError: ErrorCallback) void {
+pub fn start(ctx: ?*anyopaque, callback_: PrintCallback, onError: ErrorCallback) !void {
callback_ctx = ctx;
callback = callback_;
on_error = onError;
@@ -150,10 +144,5 @@ pub fn start(ctx: ?*anyopaque, callback_: PrintCallback, onError: ErrorCallback)
.flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND),
};
- os.sigaction(os.SIG.ABRT, &act, null);
- os.sigaction(os.SIG.BUS, &act, null);
- os.sigaction(os.SIG.FPE, &act, null);
- os.sigaction(os.SIG.ILL, &act, null);
- os.sigaction(os.SIG.SEGV, &act, null);
- os.sigaction(os.SIG.TRAP, &act, null);
+ try setup_sigactions(&act);
}