| ... | ... | @@ -91,6 +91,38 @@ const Os = switch (builtin.os.tag) { |
| 91 | 91 | }; |
| 92 | 92 | }; |
| 93 | 93 | |
| 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 | |
| 94 | 126 | fn getDirHandle(gpa: Allocator, path: std.Build.Cache.Path) !FileHandle { |
| 95 | 127 | var file_handle_buffer: [@sizeOf(std.os.linux.file_handle) + 128]u8 align(@alignOf(std.os.linux.file_handle)) = undefined; |
| 96 | 128 | var mount_id: i32 = undefined; |
| ... | ... | @@ -368,6 +400,21 @@ const Os = switch (builtin.os.tag) { |
| 368 | 400 | } |
| 369 | 401 | }; |
| 370 | 402 | |
| 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 | |
| 371 | 418 | fn getFileId(handle: windows.HANDLE) !FileId { |
| 372 | 419 | var file_id: FileId = undefined; |
| 373 | 420 | var io_status: windows.IO_STATUS_BLOCK = undefined; |
| ... | ... | @@ -572,6 +619,19 @@ const Os = switch (builtin.os.tag) { |
| 572 | 619 | break :f f; |
| 573 | 620 | }; |
| 574 | 621 | |
| 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 | |
| 575 | 635 | fn update(w: *Watch, gpa: Allocator, steps: []const *Step) !void { |
| 576 | 636 | for (steps) |step| { |
| 577 | 637 | for (step.inputs.table.keys(), step.inputs.table.values()) |path, *files| { |
| ... | ... | @@ -702,68 +762,7 @@ const Os = switch (builtin.os.tag) { |
| 702 | 762 | }; |
| 703 | 763 | |
| 704 | 764 | pub 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(); |
| 767 | 766 | } |
| 768 | 767 | |
| 769 | 768 | pub const Match = struct { |