authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-15 10:14:03-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-15 14:18:20-08:00
log8527ec9c7b229bcc8a15824e885d16abbab57534
tree12d2c2a27e9c900717a5b1e45329cc641748bf3e
parent3c708b19fea5e855197c6f3f8130a39a903b3f77

std.Io.Threaded: implement mmap fallback for Windows


1 files changed, 23 insertions(+), 5 deletions(-)

lib/std/Io/Threaded.zig+23-5
...@@ -8153,14 +8153,17 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: File, data: []const []...@@ -8153,14 +8153,17 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: File, data: []const []
8153 const t: *Threaded = @ptrCast(@alignCast(userdata));8153 const t: *Threaded = @ptrCast(@alignCast(userdata));
8154 _ = t;8154 _ = t;
81558155
8156 const DWORD = windows.DWORD;
8157
8158 var index: usize = 0;8156 var index: usize = 0;
8159 while (index < data.len and data[index].len == 0) index += 1;8157 while (index < data.len and data[index].len == 0) index += 1;
8160 if (index == data.len) return 0;8158 if (index == data.len) return 0;
8161 const buffer = data[index];8159 const buffer = data[index];
8162 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);
81638160
8161 return readFilePositionalWindows(file, buffer, offset);
8162}
8163
8164fn readFilePositionalWindows(file: File, buffer: []u8, offset: u64) File.ReadPositionalError!usize {
8165 const DWORD = windows.DWORD;
8166 const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len);
8164 var overlapped: windows.OVERLAPPED = .{8167 var overlapped: windows.OVERLAPPED = .{
8165 .Internal = 0,8168 .Internal = 0,
8166 .InternalHigh = 0,8169 .InternalHigh = 0,
...@@ -16478,7 +16481,17 @@ fn fileMemoryMapWrite(userdata: ?*anyopaque, mm: *File.MemoryMap) File.WritePosi...@@ -16478,7 +16481,17 @@ fn fileMemoryMapWrite(userdata: ?*anyopaque, mm: *File.MemoryMap) File.WritePosi
1647816481
16479fn mmSyncRead(file: File, memory: []u8, offset: u64) File.ReadPositionalError!void {16482fn mmSyncRead(file: File, memory: []u8, offset: u64) File.ReadPositionalError!void {
16480 if (is_windows) {16483 if (is_windows) {
16481 @panic("TODO");16484 var i: usize = 0;
16485 while (true) {
16486 const buf = memory[i..];
16487 if (buf.len == 0) break;
16488 const n = try readFilePositionalWindows(file, buf, offset + i);
16489 if (n == 0) {
16490 @memset(memory[i..], 0);
16491 break;
16492 }
16493 i += n;
16494 }
16482 } else if (native_os == .wasi and !builtin.link_libc) {16495 } else if (native_os == .wasi and !builtin.link_libc) {
16483 var i: usize = 0;16496 var i: usize = 0;
16484 const syscall: Syscall = try .start();16497 const syscall: Syscall = try .start();
...@@ -16569,7 +16582,12 @@ fn mmSyncRead(file: File, memory: []u8, offset: u64) File.ReadPositionalError!vo...@@ -16569,7 +16582,12 @@ fn mmSyncRead(file: File, memory: []u8, offset: u64) File.ReadPositionalError!vo
1656916582
16570fn mmSyncWrite(file: File, memory: []u8, offset: u64) File.WritePositionalError!void {16583fn mmSyncWrite(file: File, memory: []u8, offset: u64) File.WritePositionalError!void {
16571 if (is_windows) {16584 if (is_windows) {
16572 @panic("TODO");16585 var i: usize = 0;
16586 while (true) {
16587 const buf = memory[i..];
16588 if (buf.len == 0) break;
16589 i += try writeFilePositionalWindows(file.handle, memory[i..], offset + i);
16590 }
16573 } else if (native_os == .wasi and !builtin.link_libc) {16591 } else if (native_os == .wasi and !builtin.link_libc) {
16574 var i: usize = 0;16592 var i: usize = 0;
16575 var n: usize = undefined;16593 var n: usize = undefined;