authorgravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2025-09-01 16:43:47-04:00
committergravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2025-09-04 17:26:52-04:00
logd26b53264744842fe15227142679d481fa68e491
tree519c7c3c104792d3d1c7544d751714bcb180d0d3
parent58dda3b10b8aacf377447d36dc97efc3a3f2e21a

sendFileAll: use stream instead of sendFileReading

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

1 files changed, 11 insertions(+), 4 deletions(-)

lib/std/Io/Writer.zig+11-4
...@@ -935,17 +935,24 @@ pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) File...@@ -935,17 +935,24 @@ pub fn sendFileReading(w: *Writer, file_reader: *File.Reader, limit: Limit) File
935///935///
936/// Asserts nonzero buffer capacity.936/// Asserts nonzero buffer capacity.
937pub fn sendFileAll(w: *Writer, file_reader: *File.Reader, limit: Limit) FileAllError!usize {937pub fn sendFileAll(w: *Writer, file_reader: *File.Reader, limit: Limit) FileAllError!usize {
938 // The fallback sendFileReadingAll() path asserts non-zero buffer capacity.938 // The fallback case uses `stream`. For `File.Reader`, this requires a minumum buffer size of
939 // Explicitly assert it here as well to ensure the assert is hit even if939 // one since it uses `writableSliceGreedy(1)`. Asserting this here ensures that this will be
940 // the fallback path is not taken.940 // hit even when the fallback is not needed.
941 assert(w.buffer.len > 0);941 assert(w.buffer.len > 0);
942
942 var remaining = @intFromEnum(limit);943 var remaining = @intFromEnum(limit);
943 while (remaining > 0) {944 while (remaining > 0) {
944 const n = sendFile(w, file_reader, .limited(remaining)) catch |err| switch (err) {945 const n = sendFile(w, file_reader, .limited(remaining)) catch |err| switch (err) {
945 error.EndOfStream => break,946 error.EndOfStream => break,
946 error.Unimplemented => {947 error.Unimplemented => {
947 file_reader.mode = file_reader.mode.toReading();948 file_reader.mode = file_reader.mode.toReading();
948 remaining -= try w.sendFileReadingAll(file_reader, .limited(remaining));949 while (remaining > 0) {
950 remaining -= file_reader.interface.stream(w, .limited(remaining)) catch |e| switch (e) {
951 error.EndOfStream => break,
952 error.ReadFailed => return error.ReadFailed,
953 error.WriteFailed => return error.WriteFailed,
954 };
955 }
949 break;956 break;
950 },957 },
951 else => |e| return e,958 else => |e| return e,