diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-12-10 23:09:08 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-12-23 22:15:09 -0800 |
| commit | 94ef56ee26558daea3c7a1468f898c94735d1658 (patch) | |
| tree | 86e22c258d78ca40fb09504493bc2daaff029d6e /lib/std/Io/Threaded.zig | |
| parent | 7bc0166b7c34ac0120f50aceb7132ffaa4aeec83 (diff) | |
| download | zig-94ef56ee26558daea3c7a1468f898c94735d1658.tar.gz zig-94ef56ee26558daea3c7a1468f898c94735d1658.zip | |
std.Io.Dir: fix walking
* Make Io.Dir.Reader lower level, accepting a buffer.
* Make Io.Dir.Iterator higher level, requesting only one Entry with
every call to `next`.
Diffstat (limited to 'lib/std/Io/Threaded.zig')
| -rw-r--r-- | lib/std/Io/Threaded.zig | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 55cc21db0e..05b00b555f 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -3280,19 +3280,9 @@ fn dirReadLinux(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir const linux = std.os.linux; const t: *Threaded = @ptrCast(@alignCast(userdata)); const current_thread = Thread.getCurrent(t); - const Header = extern struct { - fill_end: usize, - }; - const header: *Header = @ptrCast(&dr.buffer); - const header_end: usize = @sizeOf(Header); - if (dr.index < header_end) { - // Initialize header. - dr.index = header_end; - header.* = .{ .fill_end = header_end }; - } var buffer_index: usize = 0; while (buffer.len - buffer_index != 0) { - if (header.fill_end - dr.index == 0) { + if (dr.end - dr.index == 0) { // Refill the buffer, unless we've already created references to // buffered data. if (buffer_index != 0) break; @@ -3303,10 +3293,9 @@ fn dirReadLinux(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir }; dr.state = .reading; } - const dents_buffer = dr.buffer[header_end..]; try current_thread.beginSyscall(); const n = while (true) { - const rc = linux.getdents64(dr.dir.handle, dents_buffer.ptr, dents_buffer.len); + const rc = linux.getdents64(dr.dir.handle, dr.buffer.ptr, dr.buffer.len); switch (linux.errno(rc)) { .SUCCESS => { current_thread.endSyscall(); @@ -3342,8 +3331,8 @@ fn dirReadLinux(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir dr.state = .finished; return 0; } - dr.index = header_end; - header.fill_end = header_end + n; + dr.index = 0; + dr.end = n; } const linux_entry: *align(1) linux.dirent64 = @ptrCast(&dr.buffer[dr.index]); const next_index = dr.index + linux_entry.reclen; |
