refactor: improve event framing in linux watcher
This commit is contained in:
parent
9d758d9823
commit
327df84e77
1 changed files with 10 additions and 7 deletions
|
|
@ -285,17 +285,20 @@ pub fn start(watcher: *LinuxWatcher) !void {
|
||||||
t.detach();
|
t.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn listen(watcher: *LinuxWatcher) !void {
|
fn listen(watcher: *LinuxWatcher) !void {
|
||||||
const gpa = watcher.gpa;
|
const gpa = watcher.gpa;
|
||||||
const Event = std.os.linux.inotify_event;
|
const Event = std.os.linux.inotify_event;
|
||||||
const event_size = @sizeOf(Event);
|
const event_size = @sizeOf(Event);
|
||||||
while (true) {
|
var buffer: [event_size * 10]u8 = undefined;
|
||||||
var buffer: [event_size * 10]u8 = undefined;
|
var event_data: []u8 = buffer[0..0];
|
||||||
const len = try std.posix.read(watcher.notify_fd, &buffer);
|
while (true) : ({
|
||||||
if (len < 0) @panic("notify fd read error");
|
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 > event_size) {
|
||||||
while (event_data.len > 0) {
|
|
||||||
const event: *Event = @ptrCast(@alignCast(event_data[0..event_size]));
|
const event: *Event = @ptrCast(@alignCast(event_data[0..event_size]));
|
||||||
const parent = watcher.watch_fds.get(event.wd).?;
|
const parent = watcher.watch_fds.get(event.wd).?;
|
||||||
event_data = event_data[event_size + event.len ..];
|
event_data = event_data[event_size + event.len ..];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue