Skip to main content

ChildStopper

Struct ChildStopper 

Source
pub struct ChildStopper { /* private fields */ }
Expand description

A cancellation primitive with tree-structured parent-child relationships.

ChildStopper uses a unified clone model: clone to share, any clone can cancel. When cancelled, it does NOT affect its parent or siblings - only this node and any of its children.

§Example

use almost_enough::{ChildStopper, Stop};

let parent = ChildStopper::new();
let child = parent.child();

// Clone to share across threads
let child_clone = child.clone();

// Any clone can cancel
child_clone.cancel();
assert!(child.should_stop());

// Parent is not affected
assert!(!parent.should_stop());

§Performance

  • Size: 8 bytes (one pointer)
  • check(): per level of the tree, a state byte and a parent pointer, with no vtable call. A parent that isn’t a ChildStopper is checked once, at the top of the chain, as a StopToken would check it.

Implementations§

Source§

impl ChildStopper

Source

pub fn new() -> Self

Create a new root tree node (no parent).

This creates a tree root that can have children added via child().

§Example
use almost_enough::{ChildStopper, Stop};

let root = ChildStopper::new();
let child = root.child();

root.cancel();
assert!(child.should_stop());
Source

pub fn with_parent<T: Stop + 'static>(parent: T) -> Self

Create a new tree node with a parent.

The child will stop if either:

  • cancel() is called on this node (or any clone)
  • Any ancestor in the parent chain is cancelled
§Example
use almost_enough::{Stopper, ChildStopper, Stop};

let root = Stopper::new();
let child = ChildStopper::with_parent(root.clone());

root.cancel();
assert!(child.should_stop());
Source

pub fn child(&self) -> ChildStopper

Create a child of this tree node.

The child will stop if either this node or any ancestor is cancelled. Cancelling the child does NOT affect this node.

§Example
use almost_enough::{ChildStopper, Stop};

let parent = ChildStopper::new();
let child = parent.child();
let grandchild = child.child();

child.cancel();
assert!(!parent.should_stop());  // Parent unaffected
assert!(child.should_stop());
assert!(grandchild.should_stop());  // Inherits from parent
Source

pub fn cancel(&self)

Cancel this node (and all its children).

This does NOT affect the parent or siblings. A Release swap: writes made before a cancel() of this node are visible to a thread whose is_cancelled returns true after it.

Source

pub fn is_cancelled(&self) -> bool

Check if this node is cancelled (either directly or via ancestor).

When it returns true, an Acquire fence follows, so this thread also sees the writes made before whichever cancel() it observed (for a parent that isn’t a ChildStopper, if that parent’s cancel is a Release swap or store, as every stop in this crate’s is). Checks are Relaxed.

Trait Implementations§

Source§

impl Cancellable for ChildStopper

Source§

fn stop(&self)

Request stop/cancellation.
Source§

impl Clone for ChildStopper

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ChildStopper

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ChildStopper

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Stop for ChildStopper

Source§

fn check(&self) -> Result<(), StopReason>

Check if the operation should stop. Read more
Source§

fn should_stop(&self) -> bool

Returns true if the operation should stop. Read more
Source§

fn may_stop(&self) -> bool

Returns true if this stop can ever signal a stop. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneStop for T
where T: Stop + Clone + 'static,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DebouncedTimeoutExt for T
where T: Stop,

Source§

fn with_debounced_timeout(self, duration: Duration) -> DebouncedTimeout<Self>

Add a debounced timeout to this stop. Read more
Source§

fn with_debounced_deadline(self, deadline: Instant) -> DebouncedTimeout<Self>

Add a debounced timeout with an absolute deadline.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<C> StopDropRoll for C
where C: Cancellable,

Source§

fn stop_on_drop(&self) -> CancelGuard<C>

Create a guard that will stop this source on drop. Read more
Source§

impl<T> StopExt for T
where T: Stop,

Source§

fn or<S: Stop>(self, other: S) -> OrStop<Self, S>

Combine this stop with another, stopping if either stops. Read more
Source§

fn into_boxed(self) -> BoxedStop
where Self: 'static,

👎Deprecated since 0.4.5:

use into_token(), whose StopToken checks the same way and is Clone

Convert this stop into a BoxedStop. Deprecated: use into_token(), whose StopToken checks the same way and is Clone.
Source§

fn into_token(self) -> StopToken
where Self: 'static,

Convert this stop into a shared, cloneable StopToken. Read more
Source§

fn child(&self) -> ChildStopper
where Self: Clone + 'static,

Create a child stop that inherits cancellation from this stop. Read more
Source§

impl<T> TimeoutExt for T
where T: Stop,

Source§

fn with_timeout(self, duration: Duration) -> WithTimeout<Self>

Add a timeout to this stop. Read more
Source§

fn with_deadline(self, deadline: Instant) -> WithTimeout<Self>

Add an absolute deadline to this stop. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.