tokio_tasker/
signaller.rs

1use std::fmt;
2use std::sync::Weak;
3
4use crate::tasker::Shared;
5
6/// A weak [`Tasker`] clone which can be used to signal stopping just like `Tasker`,
7/// but doesn't require dropping or calling [`finish()`]. Meant to be used from signal
8/// handlers or various other callbaks.
9///
10/// [`Tasker`]: crate::Tasker
11/// [`finish()`]: crate::Tasker::finish()
12#[derive(Clone)]
13pub struct Signaller {
14    shared: Weak<Shared>,
15}
16
17impl Signaller {
18    pub(crate) fn new(shared: Weak<Shared>) -> Self {
19        Self { shared }
20    }
21
22    /// Stop the tasks in the group.
23    ///
24    /// This will resolve all [`Stopper`] futures (including ones obtained after this call).
25    ///
26    /// Returns `true` if this was the first effective stop call
27    /// or `false` if the group was already signalled to stop.
28    ///
29    /// [`Stopper`]: crate::Stopper
30    pub fn stop(&self) -> bool {
31        if let Some(shared) = self.shared.upgrade() {
32            shared.stop()
33        } else {
34            false
35        }
36    }
37}
38
39impl fmt::Debug for Signaller {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        let ptr = self.shared.upgrade().map(|shared| shared.ptr());
42        f.debug_struct("Signaller").field("shared", &ptr).finish()
43    }
44}