aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-03-13 18:32:50 -0700
committerGitHub <noreply@github.com>2024-03-13 18:32:50 -0700
commitea8e9e668b8b566a94e8d69476d392458918382a (patch)
tree29737ffdfc6a4e17260bdb13ed1e3469210dda9c /lib/std
parent17bad9f88666bd6659bc0d6deb0acad39028291a (diff)
parent791c4491a7677506ee7f028c0692065664d0b56c (diff)
downloadzig-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.zig33
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;