Commit 32fd637e57

Andrew Kelley <andrew@ziglang.org>
2020-12-19 00:14:46
stage2: replace WaitGroup with a trivially auditable one
1 parent 0d1cd0d
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();
 }