diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-12-21 14:21:51 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-12-23 13:36:21 -0800 |
| commit | 829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2 (patch) | |
| tree | 879be7bfbb6b021489f1d45d63af9732dba4593a /src/WaitGroup.zig | |
| parent | 4eb4d26fa14524652bed69325eb491f39701d995 (diff) | |
| download | zig-829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2.tar.gz zig-829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2.zip | |
kprotty ThreadPool and WaitGroup patch
Diffstat (limited to 'src/WaitGroup.zig')
| -rw-r--r-- | src/WaitGroup.zig | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/WaitGroup.zig b/src/WaitGroup.zig index 2c1b49224b..e5d4e600e2 100644 --- a/src/WaitGroup.zig +++ b/src/WaitGroup.zig @@ -5,11 +5,10 @@ // and substantial portions of the software. const std = @import("std"); const WaitGroup = @This(); -const Event = @import("Event.zig"); lock: std.Mutex = .{}, counter: usize = 0, -event: ?*Event = null, +event: ?*std.ResetEvent = null, pub fn start(self: *WaitGroup) void { const held = self.lock.acquire(); @@ -19,28 +18,33 @@ pub fn start(self: *WaitGroup) void { } pub fn stop(self: *WaitGroup) void { - var event: ?*Event = null; - defer if (event) |waiter| - waiter.set(); - const held = self.lock.acquire(); defer held.release(); self.counter -= 1; - if (self.counter == 0) - std.mem.swap(?*Event, &self.event, &event); + + if (self.counter == 0) { + if (self.event) |event| { + self.event = null; + event.set(); + } + } } pub fn wait(self: *WaitGroup) void { - var event = Event{}; - var has_event = false; - defer if (has_event) - event.wait(); - const held = self.lock.acquire(); - defer held.release(); - has_event = self.counter != 0; - if (has_event) - self.event = &event; + if (self.counter == 0) { + held.release(); + return; + } + + var event = std.ResetEvent.init(); + defer event.deinit(); + + std.debug.assert(self.event == null); + self.event = &event; + + held.release(); + event.wait(); } |
