1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use std::{cell::UnsafeCell, future::Future, pin::Pin, ptr, sync::atomic::AtomicPtr};

pub(crate) struct TaskHandle {
    task: UnsafeCell<Option<Pin<Box<dyn Future<Output = ()> + 'static>>>>,
    pub(crate) next: AtomicPtr<()>,
}

impl TaskHandle {
    pub(crate) const fn new() -> Self {
        TaskHandle {
            task: UnsafeCell::new(None),
            next: AtomicPtr::new(ptr::null_mut()),
        }
    }

    pub(crate) unsafe fn task_mut(
        &self,
    ) -> &mut Option<Pin<Box<dyn Future<Output = ()> + 'static>>> {
        &mut *self.task.get()
    }
}