From 2e1f469e3e7a94772878ece12acf88997630f257 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sat, 14 Mar 2026 23:51:11 +0100 Subject: [PATCH] fix: log before stopping watch thread on handler error --- src/backend/INotify.zig | 5 ++++- src/backend/KQueue.zig | 15 ++++++++++++--- src/backend/KQueueDir.zig | 25 ++++++++++++++++++++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/backend/INotify.zig b/src/backend/INotify.zig index 268b8ed..cf4c0fb 100644 --- a/src/backend/INotify.zig +++ b/src/backend/INotify.zig @@ -121,7 +121,10 @@ pub fn Create(comptime variant: InterfaceType) type { _ = std.posix.poll(&pfds, -1) catch return; if (pfds[1].revents & std.posix.POLL.IN != 0) return; // stop signal if (pfds[0].revents & std.posix.POLL.IN != 0) { - self.handle_read_ready(allocator) catch return; + self.handle_read_ready(allocator) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } } } diff --git a/src/backend/KQueue.zig b/src/backend/KQueue.zig index 1e94438..97fbdff 100644 --- a/src/backend/KQueue.zig +++ b/src/backend/KQueue.zig @@ -136,7 +136,10 @@ fn thread_fn(self: *@This(), allocator: std.mem.Allocator) void { if (file_path_len > 0) { const fp = file_path_buf[0..file_path_len]; if (ev.fflags & (NOTE_WRITE | NOTE_EXTEND) != 0) - self.handler.change(fp, EventType.modified, .file) catch return; + self.handler.change(fp, EventType.modified, .file) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; continue; } @@ -157,9 +160,15 @@ fn thread_fn(self: *@This(), allocator: std.mem.Allocator) void { if (dir_path_len == 0) continue; const dir_path = dir_path_buf[0..dir_path_len]; if (ev.fflags & NOTE_DELETE != 0) { - self.handler.change(dir_path, EventType.deleted, .dir) catch return; + self.handler.change(dir_path, EventType.deleted, .dir) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & NOTE_RENAME != 0) { - self.handler.change(dir_path, EventType.renamed, .dir) catch return; + self.handler.change(dir_path, EventType.renamed, .dir) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & NOTE_WRITE != 0) { self.scan_dir(allocator, dir_path) catch {}; } diff --git a/src/backend/KQueueDir.zig b/src/backend/KQueueDir.zig index bdf4c5f..594dd6e 100644 --- a/src/backend/KQueueDir.zig +++ b/src/backend/KQueueDir.zig @@ -124,17 +124,32 @@ fn thread_fn(self: *@This(), allocator: std.mem.Allocator) void { if (is_file) { // Explicit file watch: emit events with .file type directly. if (ev.fflags & NOTE_DELETE != 0) { - self.handler.change(watch_path, EventType.deleted, .file) catch return; + self.handler.change(watch_path, EventType.deleted, .file) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & NOTE_RENAME != 0) { - self.handler.change(watch_path, EventType.renamed, .file) catch return; + self.handler.change(watch_path, EventType.renamed, .file) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & (NOTE_WRITE | NOTE_EXTEND) != 0) { - self.handler.change(watch_path, EventType.modified, .file) catch return; + self.handler.change(watch_path, EventType.modified, .file) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } } else { if (ev.fflags & NOTE_DELETE != 0) { - self.handler.change(watch_path, EventType.deleted, .dir) catch return; + self.handler.change(watch_path, EventType.deleted, .dir) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & NOTE_RENAME != 0) { - self.handler.change(watch_path, EventType.renamed, .dir) catch return; + self.handler.change(watch_path, EventType.renamed, .dir) catch |e| { + std.log.err("nightwatch: handler returned {s}, stopping watch thread", .{@errorName(e)}); + return; + }; } else if (ev.fflags & NOTE_WRITE != 0) { self.scan_dir(allocator, watch_path) catch {}; }