add thread control via wake hints
This commit is contained in:
parent
4abd5b9019
commit
221519c705
1 changed files with 20 additions and 0 deletions
|
@ -9,6 +9,7 @@ const AtomicU32 = std.atomic.Atomic(u32);
|
|||
const Signals = struct {
|
||||
quit: AtomicBool,
|
||||
processed: AtomicU32,
|
||||
eof_block: AtomicU32,
|
||||
|
||||
const Self = @This();
|
||||
|
||||
|
@ -16,6 +17,7 @@ const Signals = struct {
|
|||
return Self{
|
||||
.quit = AtomicBool.init(false),
|
||||
.processed = AtomicU32.init(0),
|
||||
.eof_block = AtomicU32.init(0),
|
||||
};
|
||||
}
|
||||
};
|
||||
|
@ -69,6 +71,21 @@ pub const ThreadManager = struct {
|
|||
self.arena.deinit();
|
||||
self.job_pool.deinit();
|
||||
}
|
||||
|
||||
pub fn quit(self: *Self) void {
|
||||
self.signals.quit.store(true, .Release);
|
||||
self.unblock();
|
||||
for (self.threads.items) |thread| {
|
||||
thread.join();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn eof(self: *Self) void {
|
||||
self.signals.eof_block.store(1, .Release);
|
||||
}
|
||||
pub fn unblock(self: *Self) void {
|
||||
self.signals.eof_block.store(0, .Release);
|
||||
}
|
||||
};
|
||||
|
||||
fn quantize_loop(queue: *util.JobQueue, signals: *Signals, Q_Lum: *util.QTable, Q_Chrom: *util.QTable) void {
|
||||
|
@ -76,5 +93,8 @@ fn quantize_loop(queue: *util.JobQueue, signals: *Signals, Q_Lum: *util.QTable,
|
|||
const job = queue.pop() orelse continue;
|
||||
transform.quantize(job.source, job.target, if (job.is_lum) Q_Lum else Q_Chrom);
|
||||
_ = @atomicRmw(u32, &signals.processed.value, .Add, 1, .SeqCst);
|
||||
if (signals.eof_block.load(.Acquire) == 1) {
|
||||
std.Thread.Futex.wait(&signals.eof_block, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue