mirror of
https://github.com/ziglang/zig.git
synced 2026-02-08 07:27:18 +00:00
macho: RingBuffer experiment to crack down the bug
This commit is contained in:
parent
79b92f9eb8
commit
1928ed7dab
@ -2780,10 +2780,8 @@ pub const Zld = struct {
|
||||
|
||||
const chunk_size = 0x4000;
|
||||
|
||||
var rb = RingBuffer{};
|
||||
var hasher = Md5.init(.{});
|
||||
var buffer: [chunk_size]u8 = undefined;
|
||||
var hashed: usize = 0;
|
||||
|
||||
for (subsections[0..count]) |cut| {
|
||||
const size = cut.end - cut.start;
|
||||
@ -2799,24 +2797,10 @@ pub const Zld = struct {
|
||||
const amt = try self.file.preadAll(buffer[0..fsize], fstart);
|
||||
if (amt != fsize) return error.InputOutput;
|
||||
|
||||
var leftover = rb.append(buffer[0..fsize]);
|
||||
while (leftover > 0) {
|
||||
if (rb.full()) {
|
||||
hasher.update(rb.getBuffer());
|
||||
hashed += rb.getBuffer().len;
|
||||
rb.clear();
|
||||
}
|
||||
leftover = rb.append(buffer[fsize - leftover ..]);
|
||||
}
|
||||
hasher.update(buffer[0..fsize]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!rb.empty()) {
|
||||
hasher.update(rb.getBuffer());
|
||||
hashed += rb.getBuffer().len;
|
||||
rb.clear();
|
||||
}
|
||||
|
||||
hasher.final(&self.uuid_cmd.uuid);
|
||||
conformUuid(&self.uuid_cmd.uuid);
|
||||
},
|
||||
@ -2826,44 +2810,6 @@ pub const Zld = struct {
|
||||
try self.file.pwriteAll(&self.uuid_cmd.uuid, in_file);
|
||||
}
|
||||
|
||||
const RingBuffer = struct {
|
||||
buffer: [chunk_size]u8 = undefined,
|
||||
pos: usize = 0,
|
||||
|
||||
const chunk_size = 0x4000;
|
||||
|
||||
fn append(rb: *RingBuffer, data: []u8) usize {
|
||||
const cpy_size = if (data.len > rb.available())
|
||||
data.len - rb.available()
|
||||
else
|
||||
data.len;
|
||||
mem.copy(u8, rb.buffer[rb.pos..], data[0..cpy_size]);
|
||||
rb.pos += cpy_size;
|
||||
const leftover = data.len - cpy_size;
|
||||
return leftover;
|
||||
}
|
||||
|
||||
fn available(rb: RingBuffer) usize {
|
||||
return rb.buffer.len - rb.pos;
|
||||
}
|
||||
|
||||
fn clear(rb: *RingBuffer) void {
|
||||
rb.pos = 0;
|
||||
}
|
||||
|
||||
fn full(rb: RingBuffer) bool {
|
||||
return rb.buffer.len == rb.pos;
|
||||
}
|
||||
|
||||
fn empty(rb: RingBuffer) bool {
|
||||
return rb.pos == 0;
|
||||
}
|
||||
|
||||
fn getBuffer(rb: *const RingBuffer) []const u8 {
|
||||
return rb.buffer[0..rb.pos];
|
||||
}
|
||||
};
|
||||
|
||||
inline fn conformUuid(out: *[Md5.digest_length]u8) void {
|
||||
// LC_UUID uuids should conform to RFC 4122 UUID version 4 & UUID version 5 formats
|
||||
out[6] = (out[6] & 0x0F) | (3 << 4);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user