authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-10 19:05:31-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-11 12:27:52-07:00
log282c3575b16499518b19ee9b1a8364c9379dab94
tree5032afc9b6c30449cb6fa193b5ca7c954b6e2dd5
parent60f8584927a1df4b08d1868ec4db5e6da4cad33d

std.fs.File: prefer getSize over getEndPos

The former detects when it is appropriate to switch to streaming mode. closes #24798

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

lib/std/fs/File.zig+5-24
...@@ -1219,6 +1219,7 @@ pub const Reader = struct {...@@ -1219,6 +1219,7 @@ pub const Reader = struct {
1219 r.size = st.size;1219 r.size = st.size;
1220 return st.size;1220 return st.size;
1221 } else {1221 } else {
1222 r.mode = r.mode.toStreaming();
1222 r.size_err = error.Streaming;1223 r.size_err = error.Streaming;
1223 return error.Streaming;1224 return error.Streaming;
1224 }1225 }
...@@ -1419,13 +1420,8 @@ pub const Reader = struct {...@@ -1419,13 +1420,8 @@ pub const Reader = struct {
1419 const pos = r.pos;1420 const pos = r.pos;
1420 switch (r.mode) {1421 switch (r.mode) {
1421 .positional, .positional_reading => {1422 .positional, .positional_reading => {
1422 const size = r.size orelse {1423 const size = r.getSize() catch {
1423 if (file.getEndPos()) |size| {1424 r.mode = r.mode.toStreaming();
1424 r.size = size;
1425 } else |err| {
1426 r.size_err = err;
1427 r.mode = r.mode.toStreaming();
1428 }
1429 return 0;1425 return 0;
1430 };1426 };
1431 const delta = @min(@intFromEnum(limit), size - pos);1427 const delta = @min(@intFromEnum(limit), size - pos);
...@@ -1472,14 +1468,7 @@ pub const Reader = struct {...@@ -1472,14 +1468,7 @@ pub const Reader = struct {
1472 r.pos = pos + n;1468 r.pos = pos + n;
1473 return n;1469 return n;
1474 }1470 }
1475 const size = r.size orelse {1471 const size = r.getSize() catch return 0;
1476 if (file.getEndPos()) |size| {
1477 r.size = size;
1478 } else |err| {
1479 r.size_err = err;
1480 }
1481 return 0;
1482 };
1483 const n = @min(size - pos, maxInt(i64), @intFromEnum(limit));1472 const n = @min(size - pos, maxInt(i64), @intFromEnum(limit));
1484 file.seekBy(n) catch |err| {1473 file.seekBy(n) catch |err| {
1485 r.seek_err = err;1474 r.seek_err = err;
...@@ -1912,15 +1901,7 @@ pub const Writer = struct {...@@ -1912,15 +1901,7 @@ pub const Writer = struct {
1912 var off: std.os.linux.off_t = undefined;1901 var off: std.os.linux.off_t = undefined;
1913 const off_ptr: ?*std.os.linux.off_t, const count: usize = switch (file_reader.mode) {1902 const off_ptr: ?*std.os.linux.off_t, const count: usize = switch (file_reader.mode) {
1914 .positional => o: {1903 .positional => o: {
1915 const size = file_reader.size orelse {1904 const size = file_reader.getSize() catch return 0;
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 };
1924 off = std.math.cast(std.os.linux.off_t, file_reader.pos) orelse return error.ReadFailed;1905 off = std.math.cast(std.os.linux.off_t, file_reader.pos) orelse return error.ReadFailed;
1925 break :o .{ &off, @min(@intFromEnum(limit), size - file_reader.pos, max_count) };1906 break :o .{ &off, @min(@intFromEnum(limit), size - file_reader.pos, max_count) };
1926 },1907 },