Further progress on extraction

This commit is contained in:
Caleb Gardner
2025-07-21 06:40:18 -05:00
parent 8998d28253
commit d5c50b19f2
4 changed files with 109 additions and 27 deletions
+13 -6
View File
@@ -190,8 +190,10 @@ pub fn DataReader(comptime T: type) type {
if (self.pool == null) return DataReaderError.ThreadPoolNotSet;
var mut: std.Thread.Mutex = .{};
var cur_idx: usize = 0;
var block_wg: std.Thread.WaitGroup = .{};
var finish_mut: std.Thread.Mutex = .{};
var block_wg = try self.alloc.create(std.Thread.WaitGroup);
block_wg.* = .{};
const finish_mut = try self.alloc.create(std.Thread.Mutex);
finish_mut.* = .{};
var completed: ?std.AutoHashMap(usize, []u8) = null;
if (!comptime std.meta.hasFn(@TypeOf(writer), "pwrite")) {
completed = std.AutoHashMap(usize, []u8).init(self.alloc);
@@ -207,9 +209,9 @@ pub fn DataReader(comptime T: type) type {
},
blk: {
if (comptime std.meta.hasFn(@TypeOf(writer), "pwrite")) {
break :blk .{ self, &block_wg, errs, i, writer, &finish_mut, on_finish, on_finish_args };
break :blk .{ self, block_wg, errs, i, writer, finish_mut, on_finish, on_finish_args };
} else {
break :blk .{ self, &block_wg, &mut, &cur_idx, errs, &completed.?, i, writer, &finish_mut, on_finish, on_finish_args };
break :blk .{ self, block_wg, &mut, &cur_idx, errs, &completed.?, i, writer, finish_mut, on_finish, on_finish_args };
}
},
);
@@ -267,7 +269,7 @@ pub fn DataReader(comptime T: type) type {
writer: anytype,
) void {
if (errs.items.len > 0) return;
if (self.sizes[idx].size == 0) {
if (idx < self.sizes.len and self.sizes[idx].size == 0) {
var pos = idx * self.block_size;
if (self.frag.len == 0 and idx == self.sizes.len - 1) {
pos += self.file_size % self.block_size;
@@ -351,8 +353,13 @@ pub fn DataReader(comptime T: type) type {
self.writeBlockToPWrite(errs, idx, writer);
finish_mut.lock();
block_wg.finish();
defer finish_mut.unlock();
defer {
const done = block_wg.isDone();
finish_mut.unlock();
if (done) self.alloc.destroy(finish_mut);
}
if (block_wg.isDone()) {
self.alloc.destroy(block_wg);
@call(.auto, on_finish, on_finish_args);
}
}