authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-19 16:13:28-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-20 15:08:59-07:00
log10d30838d1887a8585e79ad7a680d3067674c9d9
tree8b5e4cbf8fb2fcff447c511e0ef313d5ff02659a
parentfbcffe9d5de64c792add092be2af317345a151f6

update WaitGroup to yet another version


1 files changed, 15 insertions(+), 11 deletions(-)

src/WaitGroup.zig+15-11
...@@ -9,7 +9,7 @@ const Event = @import("Event.zig");...@@ -9,7 +9,7 @@ const Event = @import("Event.zig");
99
10lock: std.Mutex = .{},10lock: std.Mutex = .{},
11counter: usize = 0,11counter: usize = 0,
12event: Event = .{},12event: ?*Event = null,
1313
14pub fn start(self: *WaitGroup) void {14pub fn start(self: *WaitGroup) void {
15 const held = self.lock.acquire();15 const held = self.lock.acquire();
...@@ -19,24 +19,28 @@ pub fn start(self: *WaitGroup) void {...@@ -19,24 +19,28 @@ pub fn start(self: *WaitGroup) void {
19}19}
2020
21pub fn stop(self: *WaitGroup) void {21pub fn stop(self: *WaitGroup) void {
22 var event: ?*Event = null;
23 defer if (event) |waiter|
24 waiter.set();
25
22 const held = self.lock.acquire();26 const held = self.lock.acquire();
23 defer held.release();27 defer held.release();
2428
25 self.counter -= 1;29 self.counter -= 1;
26 if (self.counter == 0)30 if (self.counter == 0)
27 self.event.set();31 std.mem.swap(?*Event, &self.event, &event);
28}32}
2933
30pub fn wait(self: *WaitGroup) void {34pub fn wait(self: *WaitGroup) void {
31 while (true) {35 var event = Event{};
32 {36 var has_event = false;
33 const held = self.lock.acquire();37 defer if (has_event)
34 defer held.release();38 event.wait();
3539
36 if (self.counter == 0)40 const held = self.lock.acquire();
37 return;41 defer held.release();
38 }
3942
40 self.event.wait();43 has_event = self.counter != 0;
41 }44 if (has_event)
45 self.event = &event;
42}46}