authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-24 16:29:02-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-24 16:29:02-07:00
log8819d8b06162da81a6c3b6b3f0ca708fb9acee28
tree8ded07919b0e0bfdb20aeec4c788238f0cac75ec
parent7a46ba73ceb9d5356ac0e1e0afc869b7abfa490c

std.Build.Watch: limit to one switch on os tag

DRY

1 files changed, 61 insertions(+), 62 deletions(-)

lib/std/Build/Watch.zig+61-62
......@@ -91,6 +91,38 @@ const Os = switch (builtin.os.tag) {
9191 };
9292 };
9393
94 fn init() !Watch {
95 const fan_fd = std.posix.fanotify_init(.{
96 .CLASS = .NOTIF,
97 .CLOEXEC = true,
98 .NONBLOCK = true,
99 .REPORT_NAME = true,
100 .REPORT_DIR_FID = true,
101 .REPORT_FID = true,
102 .REPORT_TARGET_FID = true,
103 }, 0) catch |err| switch (err) {
104 error.UnsupportedFlags => fatal("fanotify_init failed due to old kernel; requires 5.17+", .{}),
105 else => |e| return e,
106 };
107 return .{
108 .dir_table = .{},
109 .os = switch (builtin.os.tag) {
110 .linux => .{
111 .handle_table = .{},
112 .poll_fds = .{
113 .{
114 .fd = fan_fd,
115 .events = std.posix.POLL.IN,
116 .revents = undefined,
117 },
118 },
119 },
120 else => {},
121 },
122 .generation = 0,
123 };
124 }
125
94126 fn getDirHandle(gpa: Allocator, path: std.Build.Cache.Path) !FileHandle {
95127 var file_handle_buffer: [@sizeOf(std.os.linux.file_handle) + 128]u8 align(@alignOf(std.os.linux.file_handle)) = undefined;
96128 var mount_id: i32 = undefined;
......@@ -368,6 +400,21 @@ const Os = switch (builtin.os.tag) {
368400 }
369401 };
370402
403 fn init() !Watch {
404 return .{
405 .dir_table = .{},
406 .os = switch (builtin.os.tag) {
407 .windows => .{
408 .handle_table = .{},
409 .dir_list = .{},
410 .io_cp = null,
411 },
412 else => {},
413 },
414 .generation = 0,
415 };
416 }
417
371418 fn getFileId(handle: windows.HANDLE) !FileId {
372419 var file_id: FileId = undefined;
373420 var io_status: windows.IO_STATUS_BLOCK = undefined;
......@@ -572,6 +619,19 @@ const Os = switch (builtin.os.tag) {
572619 break :f f;
573620 };
574621
622 fn init() !Watch {
623 const kq_fd = try posix.kqueue();
624 errdefer posix.close(kq_fd);
625 return .{
626 .dir_table = .{},
627 .os = .{
628 .kq_fd = kq_fd,
629 .reaction_sets = .{},
630 },
631 .generation = 0,
632 };
633 }
634
575635 fn update(w: *Watch, gpa: Allocator, steps: []const *Step) !void {
576636 for (steps) |step| {
577637 for (step.inputs.table.keys(), step.inputs.table.values()) |path, *files| {
......@@ -702,68 +762,7 @@ const Os = switch (builtin.os.tag) {
702762};
703763
704764pub fn init() !Watch {
705 switch (builtin.os.tag) {
706 .linux => {
707 const fan_fd = std.posix.fanotify_init(.{
708 .CLASS = .NOTIF,
709 .CLOEXEC = true,
710 .NONBLOCK = true,
711 .REPORT_NAME = true,
712 .REPORT_DIR_FID = true,
713 .REPORT_FID = true,
714 .REPORT_TARGET_FID = true,
715 }, 0) catch |err| switch (err) {
716 error.UnsupportedFlags => fatal("fanotify_init failed due to old kernel; requires 5.17+", .{}),
717 else => |e| return e,
718 };
719 return .{
720 .dir_table = .{},
721 .os = switch (builtin.os.tag) {
722 .linux => .{
723 .handle_table = .{},
724 .poll_fds = .{
725 .{
726 .fd = fan_fd,
727 .events = std.posix.POLL.IN,
728 .revents = undefined,
729 },
730 },
731 },
732 else => {},
733 },
734 .generation = 0,
735 };
736 },
737 .windows => {
738 return .{
739 .dir_table = .{},
740 .os = switch (builtin.os.tag) {
741 .windows => .{
742 .handle_table = .{},
743 .dir_list = .{},
744 .io_cp = null,
745 },
746 else => {},
747 },
748 .generation = 0,
749 };
750 },
751 .dragonfly, .freebsd, .netbsd, .openbsd, .ios, .macos, .tvos, .visionos, .watchos => {
752 const posix = std.posix;
753
754 const kq_fd = try posix.kqueue();
755 errdefer posix.close(kq_fd);
756 return .{
757 .dir_table = .{},
758 .os = .{
759 .kq_fd = kq_fd,
760 .reaction_sets = .{},
761 },
762 .generation = 0,
763 };
764 },
765 else => @panic("unimplemented"),
766 }
765 return Os.init();
767766}
768767
769768pub const Match = struct {