aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Io/Threaded.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-12-10 23:09:08 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-12-23 22:15:09 -0800
commit94ef56ee26558daea3c7a1468f898c94735d1658 (patch)
tree86e22c258d78ca40fb09504493bc2daaff029d6e /lib/std/Io/Threaded.zig
parent7bc0166b7c34ac0120f50aceb7132ffaa4aeec83 (diff)
downloadzig-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.zig19
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;