diff --git a/tokio/src/sync/once_cell.rs b/tokio/src/sync/once_cell.rs index 1a2303e8e6a..82b8259c667 100644 --- a/tokio/src/sync/once_cell.rs +++ b/tokio/src/sync/once_cell.rs @@ -132,36 +132,22 @@ impl OnceCell { } } - /// Creates a new `OnceCell` that contains the provided value, if any. + /// Creates a new empty `OnceCell` instance. /// - /// If the `Option` is `None`, this is equivalent to `OnceCell::new`. + /// Equivalent to `OnceCell::new`, except that it can be used in static + /// variables. /// - /// [`OnceCell::new`]: crate::sync::OnceCell::new - // Once https://github.com/rust-lang/rust/issues/73255 lands - // and tokio MSRV is bumped to the rustc version with it stablised, - // we can made this function available in const context, - // by creating `Semaphore::const_new_closed`. - pub fn new_with(value: Option) -> Self { - if let Some(v) = value { - OnceCell::from(v) - } else { - OnceCell::new() - } - } - - /// Creates a new `OnceCell` that contains the provided value. + /// When using the `tracing` [unstable feature], a `OnceCell` created with + /// `const_new` will not be instrumented. As such, it will not be visible + /// in [`tokio-console`]. Instead, [`OnceCell::new`] should be used to + /// create an instrumented object if that is needed. /// /// # Example /// - /// When using the `tracing` [unstable feature], a `OnceCell` created with - /// `const_new_with` will not be instrumented. As such, it will not be - /// visible in [`tokio-console`]. Instead, [`OnceCell::new_with`] should be - /// used to create an instrumented object if that is needed. - /// /// ``` /// use tokio::sync::OnceCell; /// - /// static ONCE: OnceCell = OnceCell::const_new_with(1); + /// static ONCE: OnceCell = OnceCell::const_new(); /// /// async fn get_global_integer() -> &'static u32 { /// ONCE.get_or_init(|| async { @@ -172,37 +158,51 @@ impl OnceCell { /// #[tokio::main] /// async fn main() { /// let result = get_global_integer().await; - /// assert_eq!(*result, 1); + /// assert_eq!(*result, 2); /// } /// ``` /// /// [`tokio-console`]: https://github.com/tokio-rs/console /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] - pub const fn const_new_with(value: T) -> Self { + pub const fn const_new() -> Self { OnceCell { - value_set: AtomicBool::new(true), - value: UnsafeCell::new(MaybeUninit::new(value)), - semaphore: Semaphore::const_new_closed(), + value_set: AtomicBool::new(false), + value: UnsafeCell::new(MaybeUninit::uninit()), + semaphore: Semaphore::const_new(1), } } - /// Creates a new empty `OnceCell` instance. + /// Creates a new `OnceCell` that contains the provided value, if any. /// - /// Equivalent to `OnceCell::new`, except that it can be used in static - /// variables. + /// If the `Option` is `None`, this is equivalent to `OnceCell::new`. /// - /// When using the `tracing` [unstable feature], a `OnceCell` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`OnceCell::new`] should be used to - /// create an instrumented object if that is needed. + /// [`OnceCell::new`]: crate::sync::OnceCell::new + // Once https://github.com/rust-lang/rust/issues/73255 lands + // and tokio MSRV is bumped to the rustc version with it stablised, + // we can made this function available in const context, + // by creating `Semaphore::const_new_closed`. + pub fn new_with(value: Option) -> Self { + if let Some(v) = value { + OnceCell::from(v) + } else { + OnceCell::new() + } + } + + /// Creates a new `OnceCell` that contains the provided value. /// /// # Example /// + /// When using the `tracing` [unstable feature], a `OnceCell` created with + /// `const_new_with` will not be instrumented. As such, it will not be + /// visible in [`tokio-console`]. Instead, [`OnceCell::new_with`] should be + /// used to create an instrumented object if that is needed. + /// /// ``` /// use tokio::sync::OnceCell; /// - /// static ONCE: OnceCell = OnceCell::const_new(); + /// static ONCE: OnceCell = OnceCell::const_new_with(1); /// /// async fn get_global_integer() -> &'static u32 { /// ONCE.get_or_init(|| async { @@ -213,18 +213,18 @@ impl OnceCell { /// #[tokio::main] /// async fn main() { /// let result = get_global_integer().await; - /// assert_eq!(*result, 2); + /// assert_eq!(*result, 1); /// } /// ``` /// /// [`tokio-console`]: https://github.com/tokio-rs/console /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] - pub const fn const_new() -> Self { + pub const fn const_new_with(value: T) -> Self { OnceCell { - value_set: AtomicBool::new(false), - value: UnsafeCell::new(MaybeUninit::uninit()), - semaphore: Semaphore::const_new(1), + value_set: AtomicBool::new(true), + value: UnsafeCell::new(MaybeUninit::new(value)), + semaphore: Semaphore::const_new_closed(), } }