Commit 32fd637e57
Changed files (1)
src/WaitGroup.zig
@@ -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();
}