authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-13 18:32:50-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-03-13 18:32:50-07:00
logea8e9e668b8b566a94e8d69476d392458918382a
tree29737ffdfc6a4e17260bdb13ed1e3469210dda9c
parent17bad9f88666bd6659bc0d6deb0acad39028291a
parent791c4491a7677506ee7f028c0692065664d0b56c
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #19289 from ianic/issue_19052

compress.xz: fix slow running read loop

1 files changed, 15 insertions(+), 18 deletions(-)

lib/std/compress/xz/block.zig+15-18
...@@ -34,6 +34,7 @@ pub fn Decoder(comptime ReaderType: type) type {...@@ -34,6 +34,7 @@ pub fn Decoder(comptime ReaderType: type) type {
34 check: xz.Check,34 check: xz.Check,
35 err: ?Error,35 err: ?Error,
36 to_read: ArrayListUnmanaged(u8),36 to_read: ArrayListUnmanaged(u8),
37 read_pos: usize,
37 block_count: usize,38 block_count: usize,
3839
39 fn init(allocator: Allocator, in_reader: ReaderType, check: xz.Check) !Self {40 fn init(allocator: Allocator, in_reader: ReaderType, check: xz.Check) !Self {
...@@ -43,6 +44,7 @@ pub fn Decoder(comptime ReaderType: type) type {...@@ -43,6 +44,7 @@ pub fn Decoder(comptime ReaderType: type) type {
43 .check = check,44 .check = check,
44 .err = null,45 .err = null,
45 .to_read = .{},46 .to_read = .{},
47 .read_pos = 0,
46 .block_count = 0,48 .block_count = 0,
47 };49 };
48 }50 }
...@@ -57,25 +59,22 @@ pub fn Decoder(comptime ReaderType: type) type {...@@ -57,25 +59,22 @@ pub fn Decoder(comptime ReaderType: type) type {
5759
58 pub fn read(self: *Self, output: []u8) Error!usize {60 pub fn read(self: *Self, output: []u8) Error!usize {
59 while (true) {61 while (true) {
60 if (self.to_read.items.len > 0) {62 const unread_len = self.to_read.items.len - self.read_pos;
61 const input = self.to_read.items;63 if (unread_len > 0) {
62 const n = @min(input.len, output.len);64 const n = @min(unread_len, output.len);
63 @memcpy(output[0..n], input[0..n]);65 @memcpy(output[0..n], self.to_read.items[self.read_pos..][0..n]);
64 std.mem.copyForwards(u8, input, input[n..]);66 self.read_pos += n;
65 self.to_read.shrinkRetainingCapacity(input.len - n);
66 if (self.to_read.items.len == 0 and self.err != null) {
67 if (self.err.? == DecodeError.EndOfStreamWithNoError) {
68 return n;
69 }
70 return self.err.?;
71 }
72 return n;67 return n;
73 }68 }
74 if (self.err != null) {69 if (self.err) |e| {
75 if (self.err.? == DecodeError.EndOfStreamWithNoError) {70 if (e == DecodeError.EndOfStreamWithNoError) {
76 return 0;71 return 0;
77 }72 }
78 return self.err.?;73 return e;
74 }
75 if (self.read_pos > 0) {
76 self.to_read.shrinkRetainingCapacity(0);
77 self.read_pos = 0;
79 }78 }
80 self.readBlock() catch |e| {79 self.readBlock() catch |e| {
81 self.err = e;80 self.err = e;
...@@ -84,8 +83,6 @@ pub fn Decoder(comptime ReaderType: type) type {...@@ -84,8 +83,6 @@ pub fn Decoder(comptime ReaderType: type) type {
84 }83 }
8584
86 fn readBlock(self: *Self) Error!void {85 fn readBlock(self: *Self) Error!void {
87 const unpacked_pos = self.to_read.items.len;
88
89 var block_counter = std.io.countingReader(self.inner_reader);86 var block_counter = std.io.countingReader(self.inner_reader);
90 const block_reader = block_counter.reader();87 const block_reader = block_counter.reader();
9188
...@@ -166,7 +163,7 @@ pub fn Decoder(comptime ReaderType: type) type {...@@ -166,7 +163,7 @@ pub fn Decoder(comptime ReaderType: type) type {
166 return error.CorruptInput;163 return error.CorruptInput;
167 }164 }
168165
169 const unpacked_bytes = self.to_read.items[unpacked_pos..];166 const unpacked_bytes = self.to_read.items;
170 if (unpacked_size) |s| {167 if (unpacked_size) |s| {
171 if (s != unpacked_bytes.len)168 if (s != unpacked_bytes.len)
172 return error.CorruptInput;169 return error.CorruptInput;