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}