Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › Io › Threaded › fileUnlock Private Function fileUnlock Doc Source Private Function std.Io.Threaded.fileUnlock
fn fileUnlock (userdata : ?*anyopaque , file : File ) void Params userdata : ?*anyopaque file : File File Io/Threaded.zig: 9579
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613 fn fileUnlock (userdata : ?*anyopaque , file : File ) void {
if (native_os == .wasi ) return ;
const t : *Threaded = @ptrCast (@alignCast (userdata ));
_ = t ;
if (is_windows ) {
var io_status_block : windows .IO_STATUS_BLOCK = undefined ;
while (true ) switch (windows .ntdll .NtUnlockFile (
file .handle ,
&io_status_block ,
&windows_lock_range_off ,
&windows_lock_range_len ,
0 ,
)) {
.SUCCESS => return ,
.CANCELLED => continue ,
.RANGE_NOT_LOCKED => if (is_debug ) unreachable else return , // Function asserts unlocked.
.ACCESS_VIOLATION => if (is_debug ) unreachable else return , // bad io_status_block pointer
else => if (is_debug ) unreachable else return , // Resource deallocation must succeed.
};
}
while (true ) {
switch (posix .errno (posix .system .flock (file .handle , posix .LOCK .UN ))) {
.SUCCESS => return ,
.CANCELED , .INTR => continue ,
.AGAIN => return assert (!is_debug ), // unlocking can't block
.BADF => return assert (!is_debug ), // File descriptor used after closed.
.INVAL => return assert (!is_debug ), // invalid parameters
.NOLCK => return assert (!is_debug ), // Resource deallocation.
.OPNOTSUPP => return assert (!is_debug ), // We already got the lock.
else => return assert (!is_debug ), // Resource deallocation must succeed.
}
}
}