zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 956f1ebc707f8a2530e49b80357768f3bf1235ac (tree)
parent e712ca595f3ac2e25911fd0d647bfb8c97019ce8
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue,  9 Jul 2024 20:26:16 -0700

std.Build.Watch: gracefully handle fanotify queue overflow

Diffstat:
Mlib/std/Build/Watch.zig | 16++++++++++++++++
1 file changed, 16 insertions(+), 0 deletions(-)

diff --git a/lib/std/Build/Watch.zig b/lib/std/Build/Watch.zig @@ -135,6 +135,12 @@ pub fn markDirtySteps(w: *Watch, gpa: Allocator) !bool { meta = @ptrCast(@as([*]u8, @ptrCast(meta)) + meta[0].event_len); }) { assert(meta[0].vers == M.VERSION); + if (meta[0].mask.Q_OVERFLOW) { + any_dirty = true; + std.log.warn("file system watch queue overflowed; falling back to fstat", .{}); + markAllFilesDirty(w, gpa); + return true; + } const fid: *align(1) fanotify.event_info_fid = @ptrCast(meta + 1); switch (fid.hdr.info_type) { .DFID_NAME => { @@ -171,3 +177,13 @@ pub fn markFailedStepsDirty(gpa: Allocator, all_steps: []const *Step) void { else => continue, }; } + +fn markAllFilesDirty(w: *Watch, gpa: Allocator) void { + for (w.handle_table.values()) |reaction_set| { + for (reaction_set.values()) |step_set| { + for (step_set.keys()) |step| { + step.recursiveReset(gpa); + } + } + } +}