Stabilize poison API of Once, rename poisoned()

This stabilizes:

* `OnceState`
* `OnceState::is_poisoned()` (previously named `poisoned()`)
* `Once::call_once_force()`

`poisoned()` was renamed because the new name is more clear as a few
people agreed and nobody objected.

Closes #33577
This commit is contained in:
Martin Habovstiak 2021-02-04 11:13:03 +01:00
parent e708cbd91c
commit f42e96149d
2 changed files with 9 additions and 15 deletions

View File

@ -125,7 +125,7 @@ unsafe impl Send for Once {}
/// State yielded to [`Once::call_once_force()`]s closure parameter. The state /// State yielded to [`Once::call_once_force()`]s closure parameter. The state
/// can be used to query the poison status of the [`Once`]. /// can be used to query the poison status of the [`Once`].
#[unstable(feature = "once_poison", issue = "33577")] #[stable(feature = "once_poison", since = "1.51.0")]
#[derive(Debug)] #[derive(Debug)]
pub struct OnceState { pub struct OnceState {
poisoned: bool, poisoned: bool,
@ -280,8 +280,6 @@ impl Once {
/// # Examples /// # Examples
/// ///
/// ``` /// ```
/// #![feature(once_poison)]
///
/// use std::sync::Once; /// use std::sync::Once;
/// use std::thread; /// use std::thread;
/// ///
@ -301,13 +299,13 @@ impl Once {
/// ///
/// // call_once_force will still run and reset the poisoned state /// // call_once_force will still run and reset the poisoned state
/// INIT.call_once_force(|state| { /// INIT.call_once_force(|state| {
/// assert!(state.poisoned()); /// assert!(state.is_poisoned());
/// }); /// });
/// ///
/// // once any success happens, we stop propagating the poison /// // once any success happens, we stop propagating the poison
/// INIT.call_once(|| {}); /// INIT.call_once(|| {});
/// ``` /// ```
#[unstable(feature = "once_poison", issue = "33577")] #[stable(feature = "once_poison", since = "1.51.0")]
pub fn call_once_force<F>(&self, f: F) pub fn call_once_force<F>(&self, f: F)
where where
F: FnOnce(&OnceState), F: FnOnce(&OnceState),
@ -526,8 +524,6 @@ impl OnceState {
/// A poisoned [`Once`]: /// A poisoned [`Once`]:
/// ///
/// ``` /// ```
/// #![feature(once_poison)]
///
/// use std::sync::Once; /// use std::sync::Once;
/// use std::thread; /// use std::thread;
/// ///
@ -540,24 +536,22 @@ impl OnceState {
/// assert!(handle.join().is_err()); /// assert!(handle.join().is_err());
/// ///
/// INIT.call_once_force(|state| { /// INIT.call_once_force(|state| {
/// assert!(state.poisoned()); /// assert!(state.is_poisoned());
/// }); /// });
/// ``` /// ```
/// ///
/// An unpoisoned [`Once`]: /// An unpoisoned [`Once`]:
/// ///
/// ``` /// ```
/// #![feature(once_poison)]
///
/// use std::sync::Once; /// use std::sync::Once;
/// ///
/// static INIT: Once = Once::new(); /// static INIT: Once = Once::new();
/// ///
/// INIT.call_once_force(|state| { /// INIT.call_once_force(|state| {
/// assert!(!state.poisoned()); /// assert!(!state.is_poisoned());
/// }); /// });
#[unstable(feature = "once_poison", issue = "33577")] #[stable(feature = "once_poison", since = "1.51.0")]
pub fn poisoned(&self) -> bool { pub fn is_poisoned(&self) -> bool {
self.poisoned self.poisoned
} }

View File

@ -69,7 +69,7 @@ fn poison_bad() {
let mut called = false; let mut called = false;
O.call_once_force(|p| { O.call_once_force(|p| {
called = true; called = true;
assert!(p.poisoned()) assert!(p.is_poisoned())
}); });
assert!(called); assert!(called);
@ -92,7 +92,7 @@ fn wait_for_force_to_finish() {
let (tx2, rx2) = channel(); let (tx2, rx2) = channel();
let t1 = thread::spawn(move || { let t1 = thread::spawn(move || {
O.call_once_force(|p| { O.call_once_force(|p| {
assert!(p.poisoned()); assert!(p.is_poisoned());
tx1.send(()).unwrap(); tx1.send(()).unwrap();
rx2.recv().unwrap(); rx2.recv().unwrap();
}); });