mirror of
https://github.com/ziglang/zig.git
synced 2026-02-14 21:38:33 +00:00
windows: workaround kernel race condition the most
This commit is contained in:
parent
ea694bfdb7
commit
958faa7031
@ -616,19 +616,22 @@ pub const File = struct {
|
||||
&coff.mf
|
||||
else
|
||||
unreachable;
|
||||
mf.file = for (0..10) |_| break base.emit.root_dir.handle.openFile(base.emit.sub_path, .{
|
||||
var attempt: u5 = 0;
|
||||
mf.file = while (true) break base.emit.root_dir.handle.openFile(base.emit.sub_path, .{
|
||||
.mode = .read_write,
|
||||
}) catch |err| switch (err) {
|
||||
error.AccessDenied => switch (builtin.os.tag) {
|
||||
.windows => {
|
||||
if (attempt == 13) return error.AccessDenied;
|
||||
// give the kernel a chance to finish closing the executable handle
|
||||
std.os.windows.kernel32.Sleep(10);
|
||||
std.os.windows.kernel32.Sleep(@as(u32, 1) << attempt >> 1);
|
||||
attempt += 1;
|
||||
continue;
|
||||
},
|
||||
else => return error.AccessDenied,
|
||||
},
|
||||
else => |e| return e,
|
||||
} else return error.AccessDenied;
|
||||
};
|
||||
base.file = mf.file;
|
||||
try mf.ensureTotalCapacity(@intCast(mf.nodes.items[0].location().resolve(mf)[1]));
|
||||
},
|
||||
|
||||
@ -71,14 +71,19 @@ pub fn main() anyerror!void {
|
||||
try testExec(allocator, "heLLo", "hello from exe\n");
|
||||
|
||||
// now rename the exe to not have an extension
|
||||
for (0..10) |_| break tmp.dir.rename("hello.exe", "hello") catch |err| switch (err) {
|
||||
error.AccessDenied => {
|
||||
// give the kernel a chance to finish closing the executable handle
|
||||
std.os.windows.kernel32.Sleep(10);
|
||||
continue;
|
||||
},
|
||||
else => |e| return e,
|
||||
} else return error.AccessDenied;
|
||||
{
|
||||
var attempt: u5 = 0;
|
||||
while (true) break tmp.dir.rename("hello.exe", "hello") catch |err| switch (err) {
|
||||
error.AccessDenied => {
|
||||
if (attempt == 13) return error.AccessDenied;
|
||||
// give the kernel a chance to finish closing the executable handle
|
||||
std.os.windows.kernel32.Sleep(@as(u32, 1) << attempt >> 1);
|
||||
attempt += 1;
|
||||
continue;
|
||||
},
|
||||
else => |e| return e,
|
||||
};
|
||||
}
|
||||
|
||||
// with extension should now fail
|
||||
try testExecError(error.FileNotFound, allocator, "hello.exe");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user