diff options
| author | LeRoyce Pearson <leroycepearson@geemili.xyz> | 2020-03-23 23:20:17 -0600 |
|---|---|---|
| committer | LeRoyce Pearson <leroycepearson@geemili.xyz> | 2020-03-23 23:20:17 -0600 |
| commit | 1a6c3aeec9226eba02655c77872bd01eaa9be711 (patch) | |
| tree | 098a278796aed924e760ff6df08ddb1b667f2f09 /lib | |
| parent | 8bec1304c35585ceacfbda3696d8af854c7ab08a (diff) | |
| download | zig-1a6c3aeec9226eba02655c77872bd01eaa9be711.tar.gz zig-1a6c3aeec9226eba02655c77872bd01eaa9be711.zip | |
Block until file is unlocked on windows
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/os/windows.zig | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index a2082b2deb..3ccd861444 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -137,32 +137,42 @@ pub fn OpenFileW( }; var io: IO_STATUS_BLOCK = undefined; const share_access = share_access_opt orelse FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE; - const rc = ntdll.NtCreateFile( - &result, - access_mask, - &attr, - &io, - null, - FILE_ATTRIBUTE_NORMAL, - share_access, - creation, - FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, - null, - 0, - ); - switch (rc) { - .SUCCESS => return result, - .OBJECT_NAME_INVALID => unreachable, - .OBJECT_NAME_NOT_FOUND => return error.FileNotFound, - .OBJECT_PATH_NOT_FOUND => return error.FileNotFound, - .NO_MEDIA_IN_DEVICE => return error.NoDevice, - .INVALID_PARAMETER => unreachable, - .SHARING_VIOLATION => return error.SharingViolation, - .ACCESS_DENIED => return error.AccessDenied, - .PIPE_BUSY => return error.PipeBusy, - .OBJECT_PATH_SYNTAX_BAD => unreachable, - .OBJECT_NAME_COLLISION => return error.PathAlreadyExists, - else => return unexpectedStatus(rc), + + var delay: usize = 1; + while (true) { + const rc = ntdll.NtCreateFile( + &result, + access_mask, + &attr, + &io, + null, + FILE_ATTRIBUTE_NORMAL, + share_access, + creation, + FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, + null, + 0, + ); + switch (rc) { + .SUCCESS => return result, + .OBJECT_NAME_INVALID => unreachable, + .OBJECT_NAME_NOT_FOUND => return error.FileNotFound, + .OBJECT_PATH_NOT_FOUND => return error.FileNotFound, + .NO_MEDIA_IN_DEVICE => return error.NoDevice, + .INVALID_PARAMETER => unreachable, + .SHARING_VIOLATION => { + std.time.sleep(delay); + if (delay < 1 * std.time.ns_per_s) { + delay *= 2; + } + continue; // TODO: don't loop for async + }, + .ACCESS_DENIED => return error.AccessDenied, + .PIPE_BUSY => return error.PipeBusy, + .OBJECT_PATH_SYNTAX_BAD => unreachable, + .OBJECT_NAME_COLLISION => return error.PathAlreadyExists, + else => return unexpectedStatus(rc), + } } } |
