From e2c565dfeebc51e120fef514f2558e77447efc2e Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 1 Apr 2024 22:02:08 +0200 Subject: [PATCH] fix: crash on shutdown from dangling logger references --- src/Lsp.zig | 1 + src/log.zig | 26 ++++++++++++++++++++------ src/project_manager.zig | 1 + src/ripgrep.zig | 7 ++++--- src/service_template.zig | 1 + src/tui/MessageFilter.zig | 2 +- src/tui/command.zig | 10 +++++----- src/tui/editor.zig | 1 + src/tui/editor_gutter.zig | 2 +- src/tui/mode/overlay/open_recent.zig | 1 + src/tui/tui.zig | 2 ++ 11 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/Lsp.zig b/src/Lsp.zig index b29106d..d71f065 100644 --- a/src/Lsp.zig +++ b/src/Lsp.zig @@ -59,6 +59,7 @@ const Process = struct { fn deinit(self: *Process) void { self.recv_buf.deinit(); + self.logger.deinit(); self.a.free(self.cmd.buf); self.close() catch {}; } diff --git a/src/log.zig b/src/log.zig index f1ff893..3455b9b 100644 --- a/src/log.zig +++ b/src/log.zig @@ -104,22 +104,24 @@ fn receive(self: *Self, from: tp.pid_ref, m: tp.message) tp.result { } pub const Logger = struct { - proc: tp.pid_ref, + proc: tp.pid, tag: []const u8, - const Self_ = @This(); + pub fn deinit(self: *const Logger) void { + self.proc.deinit(); + } - pub fn write(self: Self_, value: anytype) void { + pub fn write(self: Logger, value: anytype) void { self.proc.send(.{ "log", self.tag } ++ value) catch {}; } - pub fn print(self: Self_, comptime fmt: anytype, args: anytype) void { + pub fn print(self: Logger, comptime fmt: anytype, args: anytype) void { var buf: [max_log_message]u8 = undefined; const output = std.fmt.bufPrint(&buf, fmt, args) catch "MESSAGE TOO LARGE"; self.proc.send(.{ "log", self.tag, output }) catch {}; } - pub fn err(self: Self_, context: []const u8, e: anyerror) void { + pub fn err(self: Logger, context: []const u8, e: anyerror) void { defer tp.reset_error(); var buf: [max_log_message]u8 = undefined; var msg: []const u8 = "UNKNOWN"; @@ -146,7 +148,19 @@ pub const Logger = struct { }; pub fn logger(tag: []const u8) Logger { - return .{ .proc = tp.env.get().proc("log"), .tag = tag }; + return .{ .proc = tp.env.get().proc("log").clone(), .tag = tag }; +} + +pub fn print(tag: []const u8, comptime fmt: anytype, args: anytype) void { + const l = logger(tag); + defer l.deinit(); + return l.print(fmt, args); +} + +pub fn err(tag: []const u8, context: []const u8, e: anyerror) void { + const l = logger(tag); + defer l.deinit(); + return l.err(context, e); } pub fn subscribe() tp.result { diff --git a/src/project_manager.zig b/src/project_manager.zig index 7a5d37b..10830fe 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -97,6 +97,7 @@ const Process = struct { } self.projects.deinit(); self.parent.deinit(); + self.logger.deinit(); self.a.destroy(self); } diff --git a/src/ripgrep.zig b/src/ripgrep.zig index 2a9f33d..fb16e96 100644 --- a/src/ripgrep.zig +++ b/src/ripgrep.zig @@ -100,6 +100,7 @@ const Process = struct { fn deinit(self: *Process) void { self.output.deinit(); + self.logger.deinit(); self.a.free(self.query); self.close() catch {}; } @@ -149,7 +150,7 @@ const Process = struct { fn handle_output(self: *Process, bytes: []u8) !void { try self.output.appendSlice(bytes); - // @import("log").logger(module_name).print("{s}", .{bytes}) catch {}; + // self.logger.print("{s}", .{bytes}) catch {}; } fn handle_terminated(self: *Process) !void { @@ -161,9 +162,9 @@ const Process = struct { const msg: tp.message = .{ .buf = try cbor.fromJson(json, &msg_buf) }; try self.dispatch(msg); // var buf: [tp.max_message_size]u8 = undefined; - // @import("log").logger(module_name).print("json: {s}", .{try msg.to_json(&buf)}) catch {}; + // self.logger.print("json: {s}", .{try msg.to_json(&buf)}) catch {}; } - // @import("log").logger(module_name).print("done", .{}) catch {}; + // self.logger.print("done", .{}) catch {}; try self.parent.send(.{ self.tag, "done" }); } diff --git a/src/service_template.zig b/src/service_template.zig index 8cdff0d..19b3bbb 100644 --- a/src/service_template.zig +++ b/src/service_template.zig @@ -57,6 +57,7 @@ const Process = struct { fn deinit(self: *Process) void { self.parent.deinit(); + self.logger.deinit(); self.a.destroy(self); } diff --git a/src/tui/MessageFilter.zig b/src/tui/MessageFilter.zig index 8525b1a..d98eebf 100644 --- a/src/tui/MessageFilter.zig +++ b/src/tui/MessageFilter.zig @@ -107,7 +107,7 @@ pub const List = struct { pub fn add(self: *List, h: MessageFilter) !void { (try self.list.addOne()).* = h; - // @import("log").logger("MessageFilter").print("add: {d} {s}", .{ self.list.items.len, self.list.items[self.list.items.len - 1].vtable.type_name }); + // @import("log").print("MessageFilter", "add: {d} {s}", .{ self.list.items.len, self.list.items[self.list.items.len - 1].vtable.type_name }); } pub fn remove(self: *List, h: MessageFilter) !void { diff --git a/src/tui/command.zig b/src/tui/command.zig index a31311a..1a5e8e7 100644 --- a/src/tui/command.zig +++ b/src/tui/command.zig @@ -46,12 +46,12 @@ pub fn Closure(comptime T: type) type { pub fn register(self: *Self) !void { if (command_names.get(self.vtbl.name)) |id| { self.vtbl.id = id; - reAddCommand(&self.vtbl) catch |e| return log.logger("cmd").err("reAddCommand", e); - // log.logger("cmd").print("reAddCommand({s}) => {d}", .{ self.vtbl.name, self.vtbl.id }); + reAddCommand(&self.vtbl) catch |e| return log.err("cmd", "reAddCommand", e); + // log.print("cmd", "reAddCommand({s}) => {d}", .{ self.vtbl.name, self.vtbl.id }); } else { self.vtbl.id = try addCommand(&self.vtbl); - command_names.put(self.vtbl.name, self.vtbl.id) catch |e| return log.logger("cmd").err("addCommand", e); - // log.logger("cmd").print("addCommand({s}) => {d}", .{ self.vtbl.name, self.vtbl.id }); + command_names.put(self.vtbl.name, self.vtbl.id) catch |e| return log.err("cmd", "addCommand", e); + // log.print("cmd", "addCommand({s}) => {d}", .{ self.vtbl.name, self.vtbl.id }); } } @@ -96,7 +96,7 @@ pub fn execute(id: ID, ctx: Context) tp.result { const cmd = commands.items[id]; if (cmd) |p| { // var buf: [tp.max_message_size]u8 = undefined; - // log.logger("cmd").print("execute({s}) {s}", .{ p.name, ctx.args.to_json(&buf) catch "" }) catch |e| return tp.exit_error(e); + // log.print("cmd", "execute({s}) {s}", .{ p.name, ctx.args.to_json(&buf) catch "" }) catch |e| return tp.exit_error(e); return p.run(p, ctx); } else { return tp.exit_fmt("CommandNotAvailable: {d}", .{id}); diff --git a/src/tui/editor.zig b/src/tui/editor.zig index b17fb77..d72a048 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -297,6 +297,7 @@ pub const Editor = struct { self.cursels.deinit(); self.matches.deinit(); self.handlers.deinit(); + self.logger.deinit(); if (self.buffer) |p| p.deinit(); } diff --git a/src/tui/editor_gutter.zig b/src/tui/editor_gutter.zig index 12c1045..945632f 100644 --- a/src/tui/editor_gutter.zig +++ b/src/tui/editor_gutter.zig @@ -250,7 +250,7 @@ fn diff_update(self: *Self) !void { } fn diff_result(from: tp.pid_ref, edits: []diff.Edit) void { - diff_result_send(from, edits) catch |e| @import("log").logger(@typeName(Self)).err("diff", e); + diff_result_send(from, edits) catch |e| @import("log").err(@typeName(Self), "diff", e); } fn diff_result_send(from: tp.pid_ref, edits: []diff.Edit) !void { diff --git a/src/tui/mode/overlay/open_recent.zig b/src/tui/mode/overlay/open_recent.zig index 1fce36d..6350b6e 100644 --- a/src/tui/mode/overlay/open_recent.zig +++ b/src/tui/mode/overlay/open_recent.zig @@ -58,6 +58,7 @@ pub fn deinit(self: *Self) void { tui.current().message_filters.remove_ptr(self); if (tui.current().mainview.dynamic_cast(mainview)) |mv| mv.floating_views.remove(self.menu.menu_widget); + self.logger.deinit(); self.a.destroy(self); } diff --git a/src/tui/tui.zig b/src/tui/tui.zig index f6739da..df8ef23 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -192,6 +192,7 @@ fn deinit(self: *Self) void { if (self.sigwinch_signal) |sig| sig.deinit(); self.frame_clock.deinit(); self.nc.stop(); + self.logger.deinit(); self.a.destroy(self); } @@ -718,6 +719,7 @@ const cmds = struct { pub fn log_widgets(self: *Self, _: Ctx) tp.result { const l = log.logger("z stack"); + defer l.deinit(); var buf: [256]u8 = undefined; var buf_parent: [256]u8 = undefined; var z: i32 = 0;