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