Skip to content

Commit 282c357

Browse files
committed
std.fs.File: prefer getSize over getEndPos
The former detects when it is appropriate to switch to streaming mode. closes #24798
1 parent 60f8584 commit 282c357

File tree

1 file changed

+5
-24
lines changed

1 file changed

+5
-24
lines changed

lib/std/fs/File.zig

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,7 @@ pub const Reader = struct {
12191219
r.size = st.size;
12201220
return st.size;
12211221
} else {
1222+
r.mode = r.mode.toStreaming();
12221223
r.size_err = error.Streaming;
12231224
return error.Streaming;
12241225
}
@@ -1419,13 +1420,8 @@ pub const Reader = struct {
14191420
const pos = r.pos;
14201421
switch (r.mode) {
14211422
.positional, .positional_reading => {
1422-
const size = r.size orelse {
1423-
if (file.getEndPos()) |size| {
1424-
r.size = size;
1425-
} else |err| {
1426-
r.size_err = err;
1427-
r.mode = r.mode.toStreaming();
1428-
}
1423+
const size = r.getSize() catch {
1424+
r.mode = r.mode.toStreaming();
14291425
return 0;
14301426
};
14311427
const delta = @min(@intFromEnum(limit), size - pos);
@@ -1472,14 +1468,7 @@ pub const Reader = struct {
14721468
r.pos = pos + n;
14731469
return n;
14741470
}
1475-
const size = r.size orelse {
1476-
if (file.getEndPos()) |size| {
1477-
r.size = size;
1478-
} else |err| {
1479-
r.size_err = err;
1480-
}
1481-
return 0;
1482-
};
1471+
const size = r.getSize() catch return 0;
14831472
const n = @min(size - pos, maxInt(i64), @intFromEnum(limit));
14841473
file.seekBy(n) catch |err| {
14851474
r.seek_err = err;
@@ -1912,15 +1901,7 @@ pub const Writer = struct {
19121901
var off: std.os.linux.off_t = undefined;
19131902
const off_ptr: ?*std.os.linux.off_t, const count: usize = switch (file_reader.mode) {
19141903
.positional => o: {
1915-
const size = file_reader.size orelse {
1916-
if (file_reader.file.getEndPos()) |size| {
1917-
file_reader.size = size;
1918-
} else |err| {
1919-
file_reader.size_err = err;
1920-
file_reader.mode = .streaming;
1921-
}
1922-
return 0;
1923-
};
1904+
const size = file_reader.getSize() catch return 0;
19241905
off = std.math.cast(std.os.linux.off_t, file_reader.pos) orelse return error.ReadFailed;
19251906
break :o .{ &off, @min(@intFromEnum(limit), size - file_reader.pos, max_count) };
19261907
},

0 commit comments

Comments
 (0)