diff --git a/src/watcher/LinuxWatcher.zig b/src/watcher/LinuxWatcher.zig index 049e499..a7f602e 100644 --- a/src/watcher/LinuxWatcher.zig +++ b/src/watcher/LinuxWatcher.zig @@ -285,17 +285,20 @@ pub fn start(watcher: *LinuxWatcher) !void { t.detach(); } -pub fn listen(watcher: *LinuxWatcher) !void { +fn listen(watcher: *LinuxWatcher) !void { const gpa = watcher.gpa; const Event = std.os.linux.inotify_event; const event_size = @sizeOf(Event); - while (true) { - var buffer: [event_size * 10]u8 = undefined; - const len = try std.posix.read(watcher.notify_fd, &buffer); - if (len < 0) @panic("notify fd read error"); + var buffer: [event_size * 10]u8 = undefined; + var event_data: []u8 = buffer[0..0]; + while (true) : ({ + std.mem.copyForwards(u8, buffer[0..], event_data); + event_data = buffer[0..event_data.len]; + }) { + const len = try std.posix.read(watcher.notify_fd, buffer[event_data.len..]); + event_data = buffer[0 .. event_data.len + len]; - var event_data = buffer[0..len]; - while (event_data.len > 0) { + while (event_data.len > event_size) { const event: *Event = @ptrCast(@alignCast(event_data[0..event_size])); const parent = watcher.watch_fds.get(event.wd).?; event_data = event_data[event_size + event.len ..];