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