From b3c5f4cbb9d5c6c025e0e05acfa1ffd7753625b0 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 30 Apr 2025 11:34:41 +0200 Subject: [PATCH] feat: stop rendering on panic This improves backtraces for panics on background threads. --- src/renderer/vaxis/renderer.zig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/renderer/vaxis/renderer.zig b/src/renderer/vaxis/renderer.zig index 1b11617..11b99dd 100644 --- a/src/renderer/vaxis/renderer.zig +++ b/src/renderer/vaxis/renderer.zig @@ -95,13 +95,16 @@ pub fn deinit(self: *Self) void { self.event_buffer.deinit(); } +var in_panic: std.atomic.Value(bool) = .init(false); var panic_cleanup: ?struct { allocator: std.mem.Allocator, tty: *vaxis.Tty, vx: *vaxis.Vaxis, } = null; + 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? + in_panic.store(true, .release); const cleanup = panic_cleanup; panic_cleanup = null; 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()); } +pub fn panic_in_progress() bool { + return in_panic.load(.acquire); +} + pub fn run(self: *Self) Error!void { self.vx.sgr = .legacy; self.vx.conpty_hacks = true; @@ -130,6 +137,7 @@ pub fn run(self: *Self) Error!void { } pub fn render(self: *Self) !void { + if (in_panic.load(.acquire)) return; var bufferedWriter = self.tty.bufferedWriter(); try self.vx.render(bufferedWriter.writer().any()); try bufferedWriter.flush();