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");
99
1010lock: std.Mutex = .{},
1111counter: usize = 0,
12event: Event = .{},
12event: ?*Event = null,
1313
1414pub fn start(self: *WaitGroup) void {
1515 const held = self.lock.acquire();
......@@ -19,24 +19,28 @@ pub fn start(self: *WaitGroup) void {
1919}
2020
2121pub fn stop(self: *WaitGroup) void {
22 var event: ?*Event = null;
23 defer if (event) |waiter|
24 waiter.set();
25
2226 const held = self.lock.acquire();
2327 defer held.release();
2428
2529 self.counter -= 1;
2630 if (self.counter == 0)
27 self.event.set();
31 std.mem.swap(?*Event, &self.event, &event);
2832}
2933
3034pub fn wait(self: *WaitGroup) void {
31 while (true) {
32 {
33 const held = self.lock.acquire();
34 defer held.release();
35 var event = Event{};
36 var has_event = false;
37 defer if (has_event)
38 event.wait();
3539
36 if (self.counter == 0)
37 return;
38 }
40 const held = self.lock.acquire();
41 defer held.release();
3942
40 self.event.wait();
41 }
43 has_event = self.counter != 0;
44 if (has_event)
45 self.event = &event;
4246}