feat: stop rendering on panic
This improves backtraces for panics on background threads.
This commit is contained in:
parent
09be9b3774
commit
b3c5f4cbb9
1 changed files with 8 additions and 0 deletions
|
@ -95,13 +95,16 @@ pub fn deinit(self: *Self) void {
|
||||||
self.event_buffer.deinit();
|
self.event_buffer.deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var in_panic: std.atomic.Value(bool) = .init(false);
|
||||||
var panic_cleanup: ?struct {
|
var panic_cleanup: ?struct {
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
tty: *vaxis.Tty,
|
tty: *vaxis.Tty,
|
||||||
vx: *vaxis.Vaxis,
|
vx: *vaxis.Vaxis,
|
||||||
} = null;
|
} = null;
|
||||||
|
|
||||||
pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn {
|
pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn {
|
||||||
_ = error_return_trace; // TODO: what to do with this in zig-0.14?
|
_ = error_return_trace; // TODO: what to do with this in zig-0.14?
|
||||||
|
in_panic.store(true, .release);
|
||||||
const cleanup = panic_cleanup;
|
const cleanup = panic_cleanup;
|
||||||
panic_cleanup = null;
|
panic_cleanup = null;
|
||||||
if (cleanup) |self| {
|
if (cleanup) |self| {
|
||||||
|
@ -111,6 +114,10 @@ pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_
|
||||||
return std.debug.defaultPanic(msg, ret_addr orelse @returnAddress());
|
return std.debug.defaultPanic(msg, ret_addr orelse @returnAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn panic_in_progress() bool {
|
||||||
|
return in_panic.load(.acquire);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn run(self: *Self) Error!void {
|
pub fn run(self: *Self) Error!void {
|
||||||
self.vx.sgr = .legacy;
|
self.vx.sgr = .legacy;
|
||||||
self.vx.conpty_hacks = true;
|
self.vx.conpty_hacks = true;
|
||||||
|
@ -130,6 +137,7 @@ pub fn run(self: *Self) Error!void {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(self: *Self) !void {
|
pub fn render(self: *Self) !void {
|
||||||
|
if (in_panic.load(.acquire)) return;
|
||||||
var bufferedWriter = self.tty.bufferedWriter();
|
var bufferedWriter = self.tty.bufferedWriter();
|
||||||
try self.vx.render(bufferedWriter.writer().any());
|
try self.vx.render(bufferedWriter.writer().any());
|
||||||
try bufferedWriter.flush();
|
try bufferedWriter.flush();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue