diff options
| author | Connor Tsui <connor.tsui20@gmail.com> | 2025-08-22 14:58:42 -0400 |
|---|---|---|
| committer | Connor Tsui <connor.tsui20@gmail.com> | 2025-08-22 14:59:34 -0400 |
| commit | 06eb782c4e727c33d8548a791998a0a2cbedceae (patch) | |
| tree | 8cb98f0614e2e77e6156a20edead39f5d86975e9 /library/std/src | |
| parent | 6ba0ce40941eee1ca02e9ba49c791ada5158747a (diff) | |
| download | rust-06eb782c4e727c33d8548a791998a0a2cbedceae.tar.gz rust-06eb782c4e727c33d8548a791998a0a2cbedceae.zip | |
modify `LazyLock` poison panic message
Fixes an issue where if the underlying `Once` panics because it is poisoned, the panic displays the wrong message. Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sync/lazy_lock.rs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/library/std/src/sync/lazy_lock.rs b/library/std/src/sync/lazy_lock.rs index a40e29a772a..3231125f7a1 100644 --- a/library/std/src/sync/lazy_lock.rs +++ b/library/std/src/sync/lazy_lock.rs @@ -244,7 +244,11 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> { #[inline] #[stable(feature = "lazy_cell", since = "1.80.0")] pub fn force(this: &LazyLock<T, F>) -> &T { - this.once.call_once(|| { + this.once.call_once_force(|state| { + if state.is_poisoned() { + panic_poisoned(); + } + // SAFETY: `call_once` only runs this closure once, ever. let data = unsafe { &mut *this.data.get() }; let f = unsafe { ManuallyDrop::take(&mut data.f) }; @@ -257,8 +261,7 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> { // * the closure was called and initialized `value`. // * the closure was called and panicked, so this point is never reached. // * the closure was not called, but a previous call initialized `value`. - // * the closure was not called because the Once is poisoned, so this point - // is never reached. + // * the closure was not called because the Once is poisoned, which we handled above. // So `value` has definitely been initialized and will not be modified again. unsafe { &*(*this.data.get()).value } } |
