diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-03-13 18:32:50 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-13 18:32:50 -0700 |
| commit | ea8e9e668b8b566a94e8d69476d392458918382a (patch) | |
| tree | 29737ffdfc6a4e17260bdb13ed1e3469210dda9c /lib/std | |
| parent | 17bad9f88666bd6659bc0d6deb0acad39028291a (diff) | |
| parent | 791c4491a7677506ee7f028c0692065664d0b56c (diff) | |
| download | zig-ea8e9e668b8b566a94e8d69476d392458918382a.tar.gz zig-ea8e9e668b8b566a94e8d69476d392458918382a.zip | |
Merge pull request #19289 from ianic/issue_19052
compress.xz: fix slow running read loop
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/compress/xz/block.zig | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/lib/std/compress/xz/block.zig b/lib/std/compress/xz/block.zig index cd2c465dc5..a2557fba7c 100644 --- a/lib/std/compress/xz/block.zig +++ b/lib/std/compress/xz/block.zig @@ -34,6 +34,7 @@ pub fn Decoder(comptime ReaderType: type) type { check: xz.Check, err: ?Error, to_read: ArrayListUnmanaged(u8), + read_pos: usize, block_count: usize, fn init(allocator: Allocator, in_reader: ReaderType, check: xz.Check) !Self { @@ -43,6 +44,7 @@ pub fn Decoder(comptime ReaderType: type) type { .check = check, .err = null, .to_read = .{}, + .read_pos = 0, .block_count = 0, }; } @@ -57,25 +59,22 @@ pub fn Decoder(comptime ReaderType: type) type { pub fn read(self: *Self, output: []u8) Error!usize { while (true) { - if (self.to_read.items.len > 0) { - const input = self.to_read.items; - const n = @min(input.len, output.len); - @memcpy(output[0..n], input[0..n]); - std.mem.copyForwards(u8, input, input[n..]); - self.to_read.shrinkRetainingCapacity(input.len - n); - if (self.to_read.items.len == 0 and self.err != null) { - if (self.err.? == DecodeError.EndOfStreamWithNoError) { - return n; - } - return self.err.?; - } + const unread_len = self.to_read.items.len - self.read_pos; + if (unread_len > 0) { + const n = @min(unread_len, output.len); + @memcpy(output[0..n], self.to_read.items[self.read_pos..][0..n]); + self.read_pos += n; return n; } - if (self.err != null) { - if (self.err.? == DecodeError.EndOfStreamWithNoError) { + if (self.err) |e| { + if (e == DecodeError.EndOfStreamWithNoError) { return 0; } - return self.err.?; + return e; + } + if (self.read_pos > 0) { + self.to_read.shrinkRetainingCapacity(0); + self.read_pos = 0; } self.readBlock() catch |e| { self.err = e; @@ -84,8 +83,6 @@ pub fn Decoder(comptime ReaderType: type) type { } fn readBlock(self: *Self) Error!void { - const unpacked_pos = self.to_read.items.len; - var block_counter = std.io.countingReader(self.inner_reader); const block_reader = block_counter.reader(); @@ -166,7 +163,7 @@ pub fn Decoder(comptime ReaderType: type) type { return error.CorruptInput; } - const unpacked_bytes = self.to_read.items[unpacked_pos..]; + const unpacked_bytes = self.to_read.items; if (unpacked_size) |s| { if (s != unpacked_bytes.len) return error.CorruptInput; |
