refactor: improve event framing in linux watcher

This commit is contained in:
CJ van den Berg 2025-12-04 14:32:47 +01:00
parent 9d758d9823
commit 327df84e77
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -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 ..];