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 abort_locked_task(&task_mutex).await;
41
42 assert!(task_mutex.lock().await.is_none());
43 }
44}