Commit 7e0ce98
authored
coro::semaphore uses coro::mutex during shutdown (#399)
* coro::semaphore uses coro::mutex during shutdown
If there are multiple in-flight tasks acquiring a semaphore while another
task is calling shutdown, it was possible for a race to occur between setting the
shutdown flag and popping all awaiters to resume them and the in-flight
acquire suspending itself and adding itself to the awaiter list.
Consequently the in-progress suspending awaiter would get lost and never
wake.
Since both acquire and release already grab the internal mutex we can solve
the problem by doing the same in shutdown such that flipping the shutdown
switch and popping the awaiters is atomic. It now cannot be the case that
an acquire mid-suspend can add itself to awaiter list after the shutdown
flag is flipped.
As a consequence, shutdown is now also a coroutine that must be awaited.
* No need to grab the lock if we're already shutdown
* Fix semaphore example1 parent 276b19c commit 7e0ce98
File tree
4 files changed
+12
-6
lines changed- examples
- include/coro
- test
4 files changed
+12
-6
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
689 | 689 | | |
690 | 690 | | |
691 | 691 | | |
692 | | - | |
| 692 | + | |
693 | 693 | | |
694 | 694 | | |
695 | 695 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
88 | 89 | | |
89 | 90 | | |
90 | 91 | | |
91 | | - | |
| 92 | + | |
92 | 93 | | |
93 | 94 | | |
94 | 95 | | |
| |||
167 | 168 | | |
168 | 169 | | |
169 | 170 | | |
170 | | - | |
| 171 | + | |
171 | 172 | | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
172 | 177 | | |
173 | 178 | | |
174 | 179 | | |
175 | 180 | | |
| 181 | + | |
176 | 182 | | |
177 | 183 | | |
178 | 184 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
183 | 183 | | |
184 | 184 | | |
185 | 185 | | |
186 | | - | |
| 186 | + | |
187 | 187 | | |
188 | 188 | | |
189 | 189 | | |
| |||
252 | 252 | | |
253 | 253 | | |
254 | 254 | | |
255 | | - | |
| 255 | + | |
256 | 256 | | |
257 | 257 | | |
258 | 258 | | |
| |||
0 commit comments