mirror of
https://github.com/ziglang/zig.git
synced 2026-01-07 05:55:36 +00:00
stage2: replace WaitGroup with a trivially auditable one
This commit is contained in:
parent
0d1cd0d482
commit
32fd637e57
@ -1,22 +1,34 @@
|
||||
const std = @import("std");
|
||||
const WaitGroup = @This();
|
||||
|
||||
lock: std.Mutex = .{},
|
||||
counter: usize = 0,
|
||||
event: ?*std.AutoResetEvent = null,
|
||||
event: std.AutoResetEvent = .{},
|
||||
|
||||
pub fn start(self: *WaitGroup) void {
|
||||
_ = @atomicRmw(usize, &self.counter, .Add, 1, .SeqCst);
|
||||
const held = self.lock.acquire();
|
||||
defer held.release();
|
||||
|
||||
self.counter += 1;
|
||||
}
|
||||
|
||||
pub fn stop(self: *WaitGroup) void {
|
||||
if (@atomicRmw(usize, &self.counter, .Sub, 1, .SeqCst) == 1)
|
||||
if (@atomicRmw(?*std.AutoResetEvent, &self.event, .Xchg, null, .SeqCst)) |event|
|
||||
event.set();
|
||||
const held = self.lock.acquire();
|
||||
defer held.release();
|
||||
|
||||
self.counter -= 1;
|
||||
if (self.counter == 0)
|
||||
self.event.set();
|
||||
}
|
||||
|
||||
pub fn wait(self: *WaitGroup) void {
|
||||
var event = std.AutoResetEvent{};
|
||||
@atomicStore(?*std.AutoResetEvent, &self.event, &event, .SeqCst);
|
||||
if (@atomicLoad(usize, &self.counter, .SeqCst) != 0)
|
||||
event.wait();
|
||||
{
|
||||
const held = self.lock.acquire();
|
||||
defer held.release();
|
||||
|
||||
if (self.counter == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
self.event.wait();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user