compact-waitgroup 0.3.5

A compact asynchronous WaitGroup synchronization primitive.
Documentation
#![cfg(not(loom))]

use core::pin::Pin;

use alloc::boxed::Box;

use crate::tests::utils::{Arc, FutureTestExt, SharedData};
use crate::{GroupTokenExt, MonoWaitGroup, WaitGroup};

#[futures_test::test]
#[cfg(panic = "unwind")]
async fn test_wg_threads_panic() {
    let canary = Arc::new(SharedData::new());
    let inspector = canary.clone();
    let (mut bg_wg, bg_token) = MonoWaitGroup::new();
    let (wg, factory) = WaitGroup::new();
    async move {
        wg.await;
        canary.store();
    }
    .release_on_ready(bg_token)
    .run_in_background();

    assert!(!inspector.load());

    let tokens = core::iter::repeat_n(factory.into_token(), 4)
        .map(|h| {
            let (wg, token) = WaitGroup::new();
            async move {
                wg.await;
                panic!();
            }
            .release_on_ready(h)
            .run_in_background();
            token
        })
        .collect::<Box<[_]>>();

    assert!(!inspector.load());
    drop(tokens);

    let mut bg_wg = Pin::new(&mut bg_wg);
    bg_wg.as_mut().await;
    assert!(inspector.load());
    assert!(bg_wg.is_done());
}