@@ -25,6 +25,22 @@ union Data<T, F> {
2525///
2626/// [`LazyCell`]: crate::cell::LazyCell
2727///
28+ /// # Poisoning
29+ ///
30+ /// If the initialization closure passed to [`LazyLock::new`] panics, the lock will be poisoned.
31+ /// Once the lock is poisoned, any threads that attempt to access this lock (via a dereference
32+ /// or via an explicit call to [`force()`]) will panic.
33+ ///
34+ /// This concept is similar to that of poisoning in the [`std::sync::poison`] module. A key
35+ /// difference, however, is that poisoning in `LazyLock` is _unrecoverable_. All future accesses of
36+ /// the lock from other threads will panic, whereas a type in [`std::sync::poison`] like
37+ /// [`std::sync::poison::Mutex`] allows recovery via [`PoisonError::into_inner()`].
38+ ///
39+ /// [`force()`]: LazyLock::force
40+ /// [`std::sync::poison`]: crate::sync::poison
41+ /// [`std::sync::poison::Mutex`]: crate::sync::poison::Mutex
42+ /// [`PoisonError::into_inner()`]: crate::sync::poison::PoisonError::into_inner
43+ ///
2844/// # Examples
2945///
3046/// Initialize static variables with `LazyLock`.
@@ -102,6 +118,10 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
102118 ///
103119 /// Returns `Ok(value)` if `Lazy` is initialized and `Err(f)` otherwise.
104120 ///
121+ /// # Panics
122+ ///
123+ /// Panics if the lock is poisoned.
124+ ///
105125 /// # Examples
106126 ///
107127 /// ```
@@ -136,6 +156,15 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
136156 /// Forces the evaluation of this lazy value and returns a mutable reference to
137157 /// the result.
138158 ///
159+ /// # Panics
160+ ///
161+ /// If the initialization closure panics (the one that is passed to the [`new()`] method), the
162+ /// panic is propagated to the caller, and the lock becomes poisoned. This will cause all future
163+ /// accesses of the lock (via [`force()`] or a dereference) to panic.
164+ ///
165+ /// [`new()`]: LazyLock::new
166+ /// [`force()`]: LazyLock::force
167+ ///
139168 /// # Examples
140169 ///
141170 /// ```
@@ -193,6 +222,15 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
193222 /// This method will block the calling thread if another initialization
194223 /// routine is currently running.
195224 ///
225+ /// # Panics
226+ ///
227+ /// If the initialization closure panics (the one that is passed to the [`new()`] method), the
228+ /// panic is propagated to the caller, and the lock becomes poisoned. This will cause all future
229+ /// accesses of the lock (via [`force()`] or a dereference) to panic.
230+ ///
231+ /// [`new()`]: LazyLock::new
232+ /// [`force()`]: LazyLock::force
233+ ///
196234 /// # Examples
197235 ///
198236 /// ```
@@ -227,7 +265,8 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
227265}
228266
229267impl < T , F > LazyLock < T , F > {
230- /// Returns a mutable reference to the value if initialized, or `None` if not.
268+ /// Returns a mutable reference to the value if initialized. Otherwise (if uninitialized or
269+ /// poisoned), returns `None`.
231270 ///
232271 /// # Examples
233272 ///
@@ -256,7 +295,8 @@ impl<T, F> LazyLock<T, F> {
256295 }
257296 }
258297
259- /// Returns a reference to the value if initialized, or `None` if not.
298+ /// Returns a reference to the value if initialized. Otherwise (if uninitialized or poisoned),
299+ /// returns `None`.
260300 ///
261301 /// # Examples
262302 ///
@@ -307,6 +347,14 @@ impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> {
307347 /// This method will block the calling thread if another initialization
308348 /// routine is currently running.
309349 ///
350+ /// # Panics
351+ ///
352+ /// If the initialization closure panics (the one that is passed to the [`new()`] method), the
353+ /// panic is propagated to the caller, and the lock becomes poisoned. This will cause all future
354+ /// accesses of the lock (via [`force()`] or a dereference) to panic.
355+ ///
356+ /// [`new()`]: LazyLock::new
357+ /// [`force()`]: LazyLock::force
310358 #[ inline]
311359 fn deref ( & self ) -> & T {
312360 LazyLock :: force ( self )
@@ -315,6 +363,14 @@ impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> {
315363
316364#[ stable( feature = "lazy_deref_mut" , since = "1.89.0" ) ]
317365impl < T , F : FnOnce ( ) -> T > DerefMut for LazyLock < T , F > {
366+ /// # Panics
367+ ///
368+ /// If the initialization closure panics (the one that is passed to the [`new()`] method), the
369+ /// panic is propagated to the caller, and the lock becomes poisoned. This will cause all future
370+ /// accesses of the lock (via [`force()`] or a dereference) to panic.
371+ ///
372+ /// [`new()`]: LazyLock::new
373+ /// [`force()`]: LazyLock::force
318374 #[ inline]
319375 fn deref_mut ( & mut self ) -> & mut T {
320376 LazyLock :: force_mut ( self )
0 commit comments