aboutsummaryrefslogtreecommitdiff
path: root/src/WaitGroup.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-12-21 14:21:51 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-12-23 13:36:21 -0800
commit829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2 (patch)
tree879be7bfbb6b021489f1d45d63af9732dba4593a /src/WaitGroup.zig
parent4eb4d26fa14524652bed69325eb491f39701d995 (diff)
downloadzig-829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2.tar.gz
zig-829c00a77fd2d6b7576c6d2b724f69ba9cfe10f2.zip
kprotty ThreadPool and WaitGroup patch
Diffstat (limited to 'src/WaitGroup.zig')
-rw-r--r--src/WaitGroup.zig38
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();
}