fix: manually reschedule to avoid hang on macOS

libxev's .rearm semantics are unfortunately not very
portable---rescheduling the exact same event on macOS / kqueue seems
to cause the event loop to hang, while manually rescheduling and
returning .disarm does not.
This commit is contained in:
Rylee Lyman 2024-05-31 08:02:29 -04:00 committed by Tim Culverhouse
parent 49cc8ae7c4
commit fbaa6ca8df

View file

@ -118,7 +118,6 @@ pub fn TtyWatcher(comptime Userdata: type) type {
buf: xev.ReadBuffer, buf: xev.ReadBuffer,
r: xev.ReadError!usize, r: xev.ReadError!usize,
) xev.CallbackAction { ) xev.CallbackAction {
_ = c; // autofix
const n = r catch |err| { const n = r catch |err| {
log.err("read error: {}", .{err}); log.err("read error: {}", .{err});
return .disarm; return .disarm;
@ -230,13 +229,21 @@ pub fn TtyWatcher(comptime Userdata: type) type {
} }
} }
return .rearm; self.file.read(
loop,
c,
.{ .slice = &self.read_buf },
Self,
self,
Self.ttyReadCallback,
);
return .disarm;
} }
fn winsizeCallback( fn winsizeCallback(
ud: ?*Self, ud: ?*Self,
l: *xev.Loop, l: *xev.Loop,
_: *xev.Completion, c: *xev.Completion,
r: xev.Async.WaitError!void, r: xev.Async.WaitError!void,
) xev.CallbackAction { ) xev.CallbackAction {
_ = r catch |err| { _ = r catch |err| {
@ -248,7 +255,17 @@ pub fn TtyWatcher(comptime Userdata: type) type {
log.err("couldn't get winsize: {}", .{err}); log.err("couldn't get winsize: {}", .{err});
return .disarm; return .disarm;
}; };
return self.callback(self.ud, l, self, .{ .winsize = winsize }); const ret = self.callback(self.ud, l, self, .{ .winsize = winsize });
if (ret == .disarm) return .disarm;
self.winsize_wakeup.wait(
l,
c,
Self,
self,
winsizeCallback,
);
return .disarm;
} }
}; };
} }