zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d26b53264744842fe15227142679d481fa68e491 (tree)
parent 58dda3b10b8aacf377447d36dc97efc3a3f2e21a
Author: Kendall Condon <goon.pri.low@gmail.com>
Date:   Mon,  1 Sep 2025 16:43:47 -0400

sendFileAll: use stream instead of sendFileReading

This is a simpler implementation and allows file_reader to do more
optimal streaming.

Diffstat:
Mlib/std/Io/Writer.zig | 15+++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig @@ -935,17 +935,24 @@ pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) File /// /// Asserts nonzero buffer capacity. pub fn sendFileAll(w: *Writer, file_reader: *File.Reader, limit: Limit) FileAllError!usize { - // The fallback sendFileReadingAll() path asserts non-zero buffer capacity. - // Explicitly assert it here as well to ensure the assert is hit even if - // the fallback path is not taken. + // The fallback case uses `stream`. For `File.Reader`, this requires a minumum buffer size of + // one since it uses `writableSliceGreedy(1)`. Asserting this here ensures that this will be + // hit even when the fallback is not needed. assert(w.buffer.len > 0); + var remaining = @intFromEnum(limit); while (remaining > 0) { const n = sendFile(w, file_reader, .limited(remaining)) catch |err| switch (err) { error.EndOfStream => break, error.Unimplemented => { file_reader.mode = file_reader.mode.toReading(); - remaining -= try w.sendFileReadingAll(file_reader, .limited(remaining)); + while (remaining > 0) { + remaining -= file_reader.interface.stream(w, .limited(remaining)) catch |e| switch (e) { + error.EndOfStream => break, + error.ReadFailed => return error.ReadFailed, + error.WriteFailed => return error.WriteFailed, + }; + } break; }, else => |e| return e,