1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use async_broadcast::Sender;
use tokio::task::JoinHandle;

use crate::errors::SummaServerResult;

#[derive(Clone, Debug)]
pub enum ControlMessage {
    Shutdown,
    ForceShutdown,
}

/// Holds `JoinHandle` together with its `shutdown_trigger`
#[derive(Debug)]
pub struct ThreadHandler<T> {
    join_handle: JoinHandle<T>,
    shutdown_trigger: Sender<ControlMessage>,
}

impl<T> ThreadHandler<T> {
    pub fn new(join_handle: JoinHandle<T>, shutdown_trigger: Sender<ControlMessage>) -> ThreadHandler<T> {
        ThreadHandler { join_handle, shutdown_trigger }
    }

    pub async fn stop(self) -> SummaServerResult<T> {
        self.shutdown_trigger.broadcast(ControlMessage::Shutdown).await?;
        Ok(self.join_handle.await?)
    }

    pub async fn force_stop(self) -> SummaServerResult<T> {
        self.shutdown_trigger.broadcast(ControlMessage::ForceShutdown).await?;
        Ok(self.join_handle.await?)
    }
}