matrix_sdk/sliding_sync/
utils.rs1#![cfg(feature = "e2e-encryption")]
4
5use std::{
6 future::Future,
7 pin::Pin,
8 task::{Context, Poll},
9};
10
11use matrix_sdk_common::executor::{JoinError, JoinHandle};
12
13pub(crate) struct AbortOnDrop<T>(JoinHandle<T>);
15
16impl<T> AbortOnDrop<T> {
17 fn new(join_handle: JoinHandle<T>) -> Self {
18 Self(join_handle)
19 }
20}
21
22impl<T> Drop for AbortOnDrop<T> {
23 fn drop(&mut self) {
24 self.0.abort();
25 }
26}
27
28impl<T: 'static> Future for AbortOnDrop<T> {
29 type Output = Result<T, JoinError>;
30
31 fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
32 Pin::new(&mut self.0).poll(cx)
33 }
34}
35
36pub(crate) trait JoinHandleExt<T> {
38 fn abort_on_drop(self) -> AbortOnDrop<T>;
39}
40
41impl<T> JoinHandleExt<T> for JoinHandle<T> {
42 fn abort_on_drop(self) -> AbortOnDrop<T> {
43 AbortOnDrop::new(self)
44 }
45}