simple-shutdown 0.1.0

Simple shutdown primitives for async runtimes
Documentation
use core::{ops::Deref, sync::atomic::Ordering};

use crate::State;

pub struct Task<C: Deref<Target = State>> {
    state: C,
}

impl<C: Deref<Target = State>> Task<C> {
    pub fn new(state: C) -> Self {
        let running_tasks = state.running_tasks.fetch_add(1, Ordering::SeqCst);

        if running_tasks == usize::MAX {
            panic!();
        }

        Task { state }
    }
}

impl<C: Deref<Target = State>> Drop for Task<C> {
    fn drop(&mut self) {
        let running_tasks = self.state.running_tasks.fetch_sub(1, Ordering::SeqCst);

        if running_tasks == 1 {
            self.state.done_waker.wake();
        }
    }
}