Commit c181443
committed
Initialize the property mapping collection exactly once
Address the review remark on PropertyMappingsInternal: the lock-free
CompareExchange pattern allowed racing threads to each run the property
mapper and build their own PropertyMappingCollection, with only one of
the builds ever being published. Since the mapper may be user-supplied
and the collection is the mutable object callers manipulate through
PropertyMappings, initialization now takes a lock on the cold path so
the mapper runs exactly once.
The warm path is unchanged - a single Volatile.Read with no lock and no
allocation (re-verified at 0 B per access on a warmed-up mapping). The
other lazy members keep the lock-free pattern; their factories are
idempotent and produce values that are never mutated afterwards, so a
duplicate run is unobservable there. The comment on the member now
spells out this distinction.
Adds a test racing 64 threads on first access, asserting the mapper
runs exactly once and all threads observe the same collection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PtLPvgYW89N5hTebTKPQBk1 parent 6e27eca commit c181443
2 files changed
Lines changed: 55 additions & 11 deletions
File tree
- src
- Hl7.Fhir.Base/Introspection
- Hl7.Fhir.Support.Tests/Introspection
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
187 | 187 | | |
188 | 188 | | |
189 | 189 | | |
| 190 | + | |
190 | 191 | | |
191 | 192 | | |
192 | 193 | | |
| |||
197 | 198 | | |
198 | 199 | | |
199 | 200 | | |
200 | | - | |
201 | | - | |
202 | | - | |
203 | | - | |
204 | | - | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
205 | 216 | | |
206 | 217 | | |
207 | 218 | | |
| |||
210 | 221 | | |
211 | 222 | | |
212 | 223 | | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
219 | 236 | | |
220 | 237 | | |
221 | 238 | | |
| |||
Lines changed: 27 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
313 | 313 | | |
314 | 314 | | |
315 | 315 | | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
316 | 343 | | |
317 | 344 | | |
318 | 345 | | |
| |||
0 commit comments