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