| ... | ... | @@ -2557,19 +2557,21 @@ fn fileReadStreamingPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io |
| 2557 | 2557 | |
| 2558 | 2558 | fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize { |
| 2559 | 2559 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2560 | | try t.checkCancel(); |
| 2561 | 2560 | |
| 2562 | 2561 | const DWORD = windows.DWORD; |
| 2563 | 2562 | var index: usize = 0; |
| 2564 | 2563 | while (data[index].len == 0) index += 1; |
| 2565 | | |
| 2566 | 2564 | const buffer = data[index]; |
| 2567 | 2565 | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2568 | | var n: DWORD = undefined; |
| 2569 | | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) == 0) { |
| 2566 | |
| 2567 | while (true) { |
| 2568 | try t.checkCancel(); |
| 2569 | var n: DWORD = undefined; |
| 2570 | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) != 0) |
| 2571 | return n; |
| 2570 | 2572 | switch (windows.GetLastError()) { |
| 2571 | 2573 | .IO_PENDING => |err| return windows.errorBug(err), |
| 2572 | | .OPERATION_ABORTED => return error.Canceled, |
| 2574 | .OPERATION_ABORTED => continue, |
| 2573 | 2575 | .BROKEN_PIPE => return 0, |
| 2574 | 2576 | .HANDLE_EOF => return 0, |
| 2575 | 2577 | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| ... | ... | @@ -2579,7 +2581,6 @@ fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) |
| 2579 | 2581 | else => |err| return windows.unexpectedError(err), |
| 2580 | 2582 | } |
| 2581 | 2583 | } |
| 2582 | | return n; |
| 2583 | 2584 | } |
| 2584 | 2585 | |
| 2585 | 2586 | fn fileReadPositionalPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { |
| ... | ... | @@ -2661,33 +2662,34 @@ const fileReadPositional = switch (native_os) { |
| 2661 | 2662 | |
| 2662 | 2663 | fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { |
| 2663 | 2664 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2664 | | try t.checkCancel(); |
| 2665 | 2665 | |
| 2666 | 2666 | const DWORD = windows.DWORD; |
| 2667 | | const OVERLAPPED = windows.OVERLAPPED; |
| 2668 | 2667 | |
| 2669 | 2668 | var index: usize = 0; |
| 2670 | 2669 | while (data[index].len == 0) index += 1; |
| 2671 | | |
| 2672 | 2670 | const buffer = data[index]; |
| 2673 | 2671 | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2674 | | var n: DWORD = undefined; |
| 2675 | | var overlapped: OVERLAPPED = .{ |
| 2672 | |
| 2673 | var overlapped: windows.OVERLAPPED = .{ |
| 2676 | 2674 | .Internal = 0, |
| 2677 | 2675 | .InternalHigh = 0, |
| 2678 | 2676 | .DUMMYUNIONNAME = .{ |
| 2679 | 2677 | .DUMMYSTRUCTNAME = .{ |
| 2680 | | .Offset = @as(u32, @truncate(offset)), |
| 2681 | | .OffsetHigh = @as(u32, @truncate(offset >> 32)), |
| 2678 | .Offset = @truncate(offset), |
| 2679 | .OffsetHigh = @truncate(offset >> 32), |
| 2682 | 2680 | }, |
| 2683 | 2681 | }, |
| 2684 | 2682 | .hEvent = null, |
| 2685 | 2683 | }; |
| 2686 | 2684 | |
| 2687 | | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) == 0) { |
| 2685 | while (true) { |
| 2686 | try t.checkCancel(); |
| 2687 | var n: DWORD = undefined; |
| 2688 | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) != 0) |
| 2689 | return n; |
| 2688 | 2690 | switch (windows.GetLastError()) { |
| 2689 | 2691 | .IO_PENDING => |err| return windows.errorBug(err), |
| 2690 | | .OPERATION_ABORTED => return error.Canceled, |
| 2692 | .OPERATION_ABORTED => continue, |
| 2691 | 2693 | .BROKEN_PIPE => return 0, |
| 2692 | 2694 | .HANDLE_EOF => return 0, |
| 2693 | 2695 | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| ... | ... | @@ -2697,8 +2699,6 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, |
| 2697 | 2699 | else => |err| return windows.unexpectedError(err), |
| 2698 | 2700 | } |
| 2699 | 2701 | } |
| 2700 | | |
| 2701 | | return n; |
| 2702 | 2702 | } |
| 2703 | 2703 | |
| 2704 | 2704 | fn fileSeekBy(userdata: ?*anyopaque, file: Io.File, offset: i64) Io.File.SeekError!void { |