zig

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

commit 6ba6b98b72efcc0468ef7c3fc0cc6499e5d38ea5 (tree)
parent 2c385e58f96ea080bd6c732de422f84c6c38c2a2
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sun, 27 Jun 2021 22:32:52 -0700

std add fs.File.setLock

Windows implementation is still missing.

Diffstat:
Mlib/std/fs/file.zig | 20++++++++++++++++++++
1 file changed, 20 insertions(+), 0 deletions(-)

diff --git a/lib/std/fs/file.zig b/lib/std/fs/file.zig @@ -829,4 +829,24 @@ pub const File = struct { pub fn seekableStream(file: File) SeekableStream { return .{ .context = file }; } + + pub const SetLockError = os.FlockError; + + /// Blocks when an incompatible lock is held by another process. + /// `non_blocking` may be used to make a non-blocking request, + /// causing this function to possibly return `error.WouldBlock`. + /// A process may hold only one type of lock (shared or exclusive) on + /// a file. When a process terminates in any way, the lock is released. + /// TODO: integrate with async I/O + pub fn setLock(file: File, lock: Lock, non_blocking: bool) SetLockError!void { + if (is_windows) { + @compileError("TODO implement fs.File.setLock for Windows"); + } + const non_blocking_flag = if (non_blocking) os.LOCK_NB else @as(i32, 0); + try os.flock(file.handle, switch (lock) { + .None => os.LOCK_UN, + .Shared => os.LOCK_SH | non_blocking_flag, + .Exclusive => os.LOCK_EX | non_blocking_flag, + }); + } };