authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-22 23:28:40+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-23 18:00:05+01:00
logf8ddc3d8732feece71d6ee55cdfc4d61a5a7e16e
tree725d930ad3dcba14370029dc649df54ef1a772e4
parent9d2fe1682f19bd21a393deeea2c4173b4429b482

std: Fix file locking logic for BSD targets


4 files changed, 10 insertions(+), 15 deletions(-)

lib/std/child_process.zig+1
...@@ -368,6 +368,7 @@ pub const ChildProcess = struct {...@@ -368,6 +368,7 @@ pub const ChildProcess = struct {
368 error.DeviceBusy => unreachable,368 error.DeviceBusy => unreachable,
369 error.FileLocksNotSupported => unreachable,369 error.FileLocksNotSupported => unreachable,
370 error.BadPathName => unreachable, // Windows-only370 error.BadPathName => unreachable, // Windows-only
371 error.WouldBlock => unreachable,
371 else => |e| return e,372 else => |e| return e,
372 }373 }
373 else374 else
lib/std/fs.zig+5-3
...@@ -405,7 +405,7 @@ pub const Dir = struct {...@@ -405,7 +405,7 @@ pub const Dir = struct {
405 else => false,405 else => false,
406 };406 };
407 if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..") or407 if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..") or
408 (skip_zero_fileno and bsd_entry.d_fileno == 0))408 (skip_zero_fileno and bsd_entry.d_fileno == 0))
409 {409 {
410 continue :start_over;410 continue :start_over;
411 }411 }
...@@ -863,8 +863,8 @@ pub const Dir = struct {...@@ -863,8 +863,8 @@ pub const Dir = struct {
863 0;863 0;
864 const lock_flag: u32 = if (has_flock_open_flags) switch (flags.lock) {864 const lock_flag: u32 = if (has_flock_open_flags) switch (flags.lock) {
865 .None => @as(u32, 0),865 .None => @as(u32, 0),
866 .Shared => os.O_SHLOCK,866 .Shared => os.O_SHLOCK | nonblocking_lock_flag,
867 .Exclusive => os.O_EXLOCK,867 .Exclusive => os.O_EXLOCK | nonblocking_lock_flag,
868 } else 0;868 } else 0;
869869
870 const O_LARGEFILE = if (@hasDecl(os, "O_LARGEFILE")) os.O_LARGEFILE else 0;870 const O_LARGEFILE = if (@hasDecl(os, "O_LARGEFILE")) os.O_LARGEFILE else 0;
...@@ -1178,6 +1178,7 @@ pub const Dir = struct {...@@ -1178,6 +1178,7 @@ pub const Dir = struct {
1178 error.NoSpaceLeft => unreachable, // not providing O_CREAT1178 error.NoSpaceLeft => unreachable, // not providing O_CREAT
1179 error.PathAlreadyExists => unreachable, // not providing O_CREAT1179 error.PathAlreadyExists => unreachable, // not providing O_CREAT
1180 error.FileLocksNotSupported => unreachable, // locking folders is not supported1180 error.FileLocksNotSupported => unreachable, // locking folders is not supported
1181 error.WouldBlock => unreachable, // can't happen for directories
1181 else => |e| return e,1182 else => |e| return e,
1182 };1183 };
1183 return Dir{ .fd = fd };1184 return Dir{ .fd = fd };
...@@ -1221,6 +1222,7 @@ pub const Dir = struct {...@@ -1221,6 +1222,7 @@ pub const Dir = struct {
1221 error.NoSpaceLeft => unreachable, // not providing O_CREAT1222 error.NoSpaceLeft => unreachable, // not providing O_CREAT
1222 error.PathAlreadyExists => unreachable, // not providing O_CREAT1223 error.PathAlreadyExists => unreachable, // not providing O_CREAT
1223 error.FileLocksNotSupported => unreachable, // locking folders is not supported1224 error.FileLocksNotSupported => unreachable, // locking folders is not supported
1225 error.WouldBlock => unreachable, // can't happen for directories
1224 else => |e| return e,1226 else => |e| return e,
1225 };1227 };
1226 return Dir{ .fd = fd };1228 return Dir{ .fd = fd };
lib/std/fs/test.zig-12
...@@ -691,9 +691,6 @@ test "realpath" {...@@ -691,9 +691,6 @@ test "realpath" {
691test "open file with exclusive nonblocking lock twice" {691test "open file with exclusive nonblocking lock twice" {
692 if (builtin.os.tag == .wasi) return error.SkipZigTest;692 if (builtin.os.tag == .wasi) return error.SkipZigTest;
693693
694 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
695 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
696
697 const filename = "file_nonblocking_lock_test.txt";694 const filename = "file_nonblocking_lock_test.txt";
698695
699 var tmp = tmpDir(.{});696 var tmp = tmpDir(.{});
...@@ -709,9 +706,6 @@ test "open file with exclusive nonblocking lock twice" {...@@ -709,9 +706,6 @@ test "open file with exclusive nonblocking lock twice" {
709test "open file with shared and exclusive nonblocking lock" {706test "open file with shared and exclusive nonblocking lock" {
710 if (builtin.os.tag == .wasi) return error.SkipZigTest;707 if (builtin.os.tag == .wasi) return error.SkipZigTest;
711708
712 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
713 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
714
715 const filename = "file_nonblocking_lock_test.txt";709 const filename = "file_nonblocking_lock_test.txt";
716710
717 var tmp = tmpDir(.{});711 var tmp = tmpDir(.{});
...@@ -727,9 +721,6 @@ test "open file with shared and exclusive nonblocking lock" {...@@ -727,9 +721,6 @@ test "open file with shared and exclusive nonblocking lock" {
727test "open file with exclusive and shared nonblocking lock" {721test "open file with exclusive and shared nonblocking lock" {
728 if (builtin.os.tag == .wasi) return error.SkipZigTest;722 if (builtin.os.tag == .wasi) return error.SkipZigTest;
729723
730 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
731 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
732
733 const filename = "file_nonblocking_lock_test.txt";724 const filename = "file_nonblocking_lock_test.txt";
734725
735 var tmp = tmpDir(.{});726 var tmp = tmpDir(.{});
...@@ -791,9 +782,6 @@ test "open file with exclusive lock twice, make sure it waits" {...@@ -791,9 +782,6 @@ test "open file with exclusive lock twice, make sure it waits" {
791test "open file with exclusive nonblocking lock twice (absolute paths)" {782test "open file with exclusive nonblocking lock twice (absolute paths)" {
792 if (builtin.os.tag == .wasi) return error.SkipZigTest;783 if (builtin.os.tag == .wasi) return error.SkipZigTest;
793784
794 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
795 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
796
797 const allocator = testing.allocator;785 const allocator = testing.allocator;
798786
799 const file_paths: [1][]const u8 = .{"zig-test-absolute-paths.txt"};787 const file_paths: [1][]const u8 = .{"zig-test-absolute-paths.txt"};
lib/std/os.zig+4
...@@ -1020,6 +1020,8 @@ pub const OpenError = error{...@@ -1020,6 +1020,8 @@ pub const OpenError = error{
10201020
1021 BadPathName,1021 BadPathName,
1022 InvalidUtf8,1022 InvalidUtf8,
1023
1024 WouldBlock,
1023} || UnexpectedError;1025} || UnexpectedError;
10241026
1025/// Open and possibly create a file. Keeps trying if it gets interrupted.1027/// Open and possibly create a file. Keeps trying if it gets interrupted.
...@@ -1201,6 +1203,7 @@ pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t)...@@ -1201,6 +1203,7 @@ pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t)
1201 EEXIST => return error.PathAlreadyExists,1203 EEXIST => return error.PathAlreadyExists,
1202 EBUSY => return error.DeviceBusy,1204 EBUSY => return error.DeviceBusy,
1203 EOPNOTSUPP => return error.FileLocksNotSupported,1205 EOPNOTSUPP => return error.FileLocksNotSupported,
1206 EWOULDBLOCK => return error.WouldBlock,
1204 else => |err| return unexpectedErrno(err),1207 else => |err| return unexpectedErrno(err),
1205 }1208 }
1206 }1209 }
...@@ -4187,6 +4190,7 @@ pub fn realpathZ(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealP...@@ -4187,6 +4190,7 @@ pub fn realpathZ(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealP
4187 const flags = if (builtin.os.tag == .linux) O_PATH | O_NONBLOCK | O_CLOEXEC else O_NONBLOCK | O_CLOEXEC;4190 const flags = if (builtin.os.tag == .linux) O_PATH | O_NONBLOCK | O_CLOEXEC else O_NONBLOCK | O_CLOEXEC;
4188 const fd = openZ(pathname, flags, 0) catch |err| switch (err) {4191 const fd = openZ(pathname, flags, 0) catch |err| switch (err) {
4189 error.FileLocksNotSupported => unreachable,4192 error.FileLocksNotSupported => unreachable,
4193 error.WouldBlock => unreachable,
4190 else => |e| return e,4194 else => |e| return e,
4191 };4195 };
4192 defer close(fd);4196 defer close(fd);