Commit 3fd4932
Fix
`release_write_lock` did not verify ownership, so any thread with a
reference to the lock could clear the `RUNNING_WRITER` bit while the
original writer was still inside its critical section. A second writer
could then acquire and run concurrently, breaking write exclusivity.
`release_read_lock` decremented `@Counter` unconditionally. On a fresh
lock the counter dropped to -1, after which `max_readers?` saw
`-1 & MAX_READERS == MAX_READERS` and blocked all subsequent acquires
with `ResourceLimitError`.
Track the write owner in an `AtomicReference` and raise
`IllegalOperationError` from `release_write_lock` when the calling
thread does not hold it, covering both the wrong-thread and never-held
cases. Raise the same error from `release_read_lock` when no read
lock is currently held, matching how `ReentrantReadWriteLock` already
detects this via its per-thread `@HeldCount`.ReadWriteLock wrong-thread write release and stray read release1 parent 1974b47 commit 3fd4932
2 files changed
Lines changed: 35 additions & 6 deletions
File tree
- lib/concurrent-ruby/concurrent/atomic
- spec/concurrent/atomic
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
61 | | - | |
| 62 | + | |
| 63 | + | |
62 | 64 | | |
63 | 65 | | |
64 | 66 | | |
| |||
137 | 139 | | |
138 | 140 | | |
139 | 141 | | |
| 142 | + | |
| 143 | + | |
140 | 144 | | |
141 | 145 | | |
142 | 146 | | |
| 147 | + | |
| 148 | + | |
143 | 149 | | |
144 | 150 | | |
145 | 151 | | |
| |||
187 | 193 | | |
188 | 194 | | |
189 | 195 | | |
| 196 | + | |
190 | 197 | | |
191 | 198 | | |
192 | 199 | | |
193 | 200 | | |
194 | 201 | | |
195 | 202 | | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
196 | 206 | | |
197 | | - | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
198 | 211 | | |
199 | 212 | | |
200 | 213 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
| 125 | + | |
125 | 126 | | |
126 | 127 | | |
127 | 128 | | |
| |||
163 | 164 | | |
164 | 165 | | |
165 | 166 | | |
| 167 | + | |
166 | 168 | | |
167 | 169 | | |
168 | 170 | | |
| |||
333 | 335 | | |
334 | 336 | | |
335 | 337 | | |
336 | | - | |
337 | | - | |
| 338 | + | |
| 339 | + | |
338 | 340 | | |
339 | 341 | | |
340 | 342 | | |
| |||
488 | 490 | | |
489 | 491 | | |
490 | 492 | | |
491 | | - | |
492 | | - | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
493 | 509 | | |
494 | 510 | | |
495 | 511 | | |
| |||
0 commit comments