Skip to main content

wsio_core/utils/
task.rs

1use tokio::{
2    sync::Mutex,
3    task::JoinHandle,
4};
5
6pub async fn abort_locked_task(task: &Mutex<Option<JoinHandle<()>>>) {
7    if let Some(task) = task.lock().await.take() {
8        task.abort();
9    }
10}
11
12#[cfg(test)]
13mod tests {
14    use std::future::pending;
15
16    use tokio::spawn;
17
18    use super::*;
19
20    #[tokio::test]
21    async fn test_abort_locked_task() {
22        let handle = spawn(async {
23            pending::<()>().await;
24        });
25
26        let task_mutex = Mutex::new(Some(handle));
27
28        assert!(task_mutex.lock().await.is_some());
29
30        abort_locked_task(&task_mutex).await;
31
32        assert!(task_mutex.lock().await.is_none());
33    }
34
35    #[tokio::test]
36    async fn test_abort_locked_task_already_none() {
37        let task_mutex: Mutex<Option<JoinHandle<()>>> = Mutex::new(None);
38
39        // Should do nothing, shouldn't panic
40        abort_locked_task(&task_mutex).await;
41
42        assert!(task_mutex.lock().await.is_none());
43    }
44}