aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLeRoyce Pearson <leroycepearson@geemili.xyz>2020-03-23 23:20:17 -0600
committerLeRoyce Pearson <leroycepearson@geemili.xyz>2020-03-23 23:20:17 -0600
commit1a6c3aeec9226eba02655c77872bd01eaa9be711 (patch)
tree098a278796aed924e760ff6df08ddb1b667f2f09 /lib
parent8bec1304c35585ceacfbda3696d8af854c7ab08a (diff)
downloadzig-1a6c3aeec9226eba02655c77872bd01eaa9be711.tar.gz
zig-1a6c3aeec9226eba02655c77872bd01eaa9be711.zip
Block until file is unlocked on windows
Diffstat (limited to 'lib')
-rw-r--r--lib/std/os/windows.zig62
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),
+ }
}
}