From 5ca9e18ee27100cabea3bac47ce9330b5f16aa61 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 22 May 2024 21:21:44 +0200 Subject: [PATCH] fix(vaxis): use an independant thread for InputReader and leave it running There is no need to unblock the input reader thread. It can be cleaned up by the OS and signaling it wrecks our exit code. --- src/tui/tui.zig | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/tui/tui.zig b/src/tui/tui.zig index 9be2c30..d7a5387 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -51,7 +51,6 @@ init_timer: ?tp.timeout, sigwinch_signal: ?tp.signal = null, no_sleep: bool = false, final_exit: []const u8 = "normal", -input_reader: ?*InputReader = null, const idle_frames = 1; @@ -124,7 +123,7 @@ fn init(a: Allocator) !*Self { if (comptime @hasDecl(renderer, "input_fd")) { try self.fd_stdin.wait_read(); } else { - self.input_reader = try InputReader.create(a, self.rdr.input_fd_blocking()); + try InputReader.create(a, self.rdr.input_fd_blocking()); } self.rdr.handler_ctx = self; @@ -164,7 +163,6 @@ fn deinit(self: *Self) void { if (comptime @hasDecl(renderer, "input_fd")) self.fd_stdin.deinit(); self.logger.deinit(); - if (self.input_reader) |p| p.stop(); self.a.destroy(self); } @@ -820,18 +818,16 @@ const InputReader = struct { a: std.mem.Allocator, fd: std.posix.fd_t, pid: tp.pid, - id: ?std.Thread.Id = null, + thread: std.Thread, - fn create(a: std.mem.Allocator, fd: std.posix.fd_t) error{Exit}!*InputReader { + fn create(a: std.mem.Allocator, fd: std.posix.fd_t) error{Exit}!void { const self = a.create(InputReader) catch |e| return tp.exit_error(e); self.* = .{ .a = a, .fd = fd, .pid = tp.self_pid().clone(), + .thread = std.Thread.spawn(.{}, InputReader.start, .{self}) catch |e| return tp.exit_error(e), }; - const pid = tp.spawn_link(self.a, self, InputReader.start, "tui.InputReader") catch |e| return tp.exit_error(e); - pid.deinit(); - return self; } fn deinit(self: *InputReader) void { @@ -839,20 +835,13 @@ const InputReader = struct { self.a.destroy(self); } - fn start(self: *InputReader) tp.result { + fn start(self: *InputReader) void { defer self.deinit(); - self.id = std.Thread.getCurrentId(); var buf: [4096]u8 = undefined; while (true) { - const n = std.posix.read(self.fd, &buf) catch |e| return tp.exit_error(e); - if (n == 0) - return tp.exit_normal(); - try self.pid.send(.{ "process_input", buf[0..n] }); + const n = std.posix.read(self.fd, &buf) catch return; + if (n == 0) return; + self.pid.send(.{ "process_input", buf[0..n] }) catch {}; } } - - fn stop(self: *InputReader) void { - if (self.id) |id| - _ = std.os.linux.tkill(@intCast(id), std.os.linux.SIG.INT); - } };