diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-10-27 17:49:21 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-10-29 06:20:51 -0700 |
| commit | 135ec79f50ff36d48563be126c3e49793b04f302 (patch) | |
| tree | 9998a41a43ac5be0b14bfb9961463dff79739d59 | |
| parent | 6b8972dd22d13957fd0c844a8359c82cedcfe939 (diff) | |
| download | zig-135ec79f50ff36d48563be126c3e49793b04f302.tar.gz zig-135ec79f50ff36d48563be126c3e49793b04f302.zip | |
std.Io.File: fix stat for Windows
| -rw-r--r-- | lib/std/Io/File.zig | 4 | ||||
| -rw-r--r-- | lib/std/Io/Threaded.zig | 34 |
2 files changed, 17 insertions, 21 deletions
diff --git a/lib/std/Io/File.zig b/lib/std/Io/File.zig index 29500ffb1d..22a904cc6a 100644 --- a/lib/std/Io/File.zig +++ b/lib/std/Io/File.zig @@ -395,10 +395,6 @@ pub const Reader = struct { pub fn getSize(r: *Reader) SizeError!u64 { return r.size orelse { if (r.size_err) |err| return err; - if (std.posix.Stat == void) { - r.size_err = error.Streaming; - return error.Streaming; - } if (stat(r.file, r.io)) |st| { if (st.kind == .file) { r.size = st.size; diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index b3646cb88e..81b3d55a1f 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -2557,19 +2557,21 @@ fn fileReadStreamingPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize { const t: *Threaded = @ptrCast(@alignCast(userdata)); - try t.checkCancel(); const DWORD = windows.DWORD; var index: usize = 0; while (data[index].len == 0) index += 1; - const buffer = data[index]; const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); - var n: DWORD = undefined; - if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) == 0) { + + while (true) { + try t.checkCancel(); + var n: DWORD = undefined; + if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) != 0) + return n; switch (windows.GetLastError()) { .IO_PENDING => |err| return windows.errorBug(err), - .OPERATION_ABORTED => return error.Canceled, + .OPERATION_ABORTED => continue, .BROKEN_PIPE => return 0, .HANDLE_EOF => return 0, .NETNAME_DELETED => return error.ConnectionResetByPeer, @@ -2579,7 +2581,6 @@ fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) else => |err| return windows.unexpectedError(err), } } - return n; } fn fileReadPositionalPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { @@ -2661,33 +2662,34 @@ const fileReadPositional = switch (native_os) { fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { const t: *Threaded = @ptrCast(@alignCast(userdata)); - try t.checkCancel(); const DWORD = windows.DWORD; - const OVERLAPPED = windows.OVERLAPPED; var index: usize = 0; while (data[index].len == 0) index += 1; - const buffer = data[index]; const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); - var n: DWORD = undefined; - var overlapped: OVERLAPPED = .{ + + var overlapped: windows.OVERLAPPED = .{ .Internal = 0, .InternalHigh = 0, .DUMMYUNIONNAME = .{ .DUMMYSTRUCTNAME = .{ - .Offset = @as(u32, @truncate(offset)), - .OffsetHigh = @as(u32, @truncate(offset >> 32)), + .Offset = @truncate(offset), + .OffsetHigh = @truncate(offset >> 32), }, }, .hEvent = null, }; - if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) == 0) { + while (true) { + try t.checkCancel(); + var n: DWORD = undefined; + if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) != 0) + return n; switch (windows.GetLastError()) { .IO_PENDING => |err| return windows.errorBug(err), - .OPERATION_ABORTED => return error.Canceled, + .OPERATION_ABORTED => continue, .BROKEN_PIPE => return 0, .HANDLE_EOF => return 0, .NETNAME_DELETED => return error.ConnectionResetByPeer, @@ -2697,8 +2699,6 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, else => |err| return windows.unexpectedError(err), } } - - return n; } fn fileSeekBy(userdata: ?*anyopaque, file: Io.File, offset: i64) Io.File.SeekError!void { |
