fn drop(&mut self) {
        // cancel all the sub coroutines
        self.co_map.iter().for_each(|co| {
            unsafe { co.coroutine().cancel() };
        });

        // the SubCo drop would remove itself from the map
        // we can't remove SubCo here for:
        // 1. reduce contention
        // 2. avoid dashmap dead lock when hold item reference
        //    while other thread is removing the item
        while !self.co_map.is_empty() {
            std::thread::yield_now();
        }
    }
// when parent exit would call this drop
when parent exit would call this drop
when parent exit would call this drop
fn drop(&mut self) {
        // cancel all the sub coroutines
        self.co_map.iter().for_each(|co| {
            unsafe { co.coroutine().cancel() };
        });
        // the SubCo drop would remove itself from the map
        // we can't remove SubCo here for:
        // 1. reduce contention
        // 2. avoid dashmap dead lock when hold item reference
        //    while other thread is removing the item
        while !self.co_map.is_empty() {
            std::thread::yield_now();
        }
    }
fn drop ( & mut self ) { // cancel all the sub coroutines self . co_map . iter ( ) . for_each ( | co | { unsafe { co . coroutine ( ) . cancel ( ) } ; } ) ; // the SubCo drop would remove itself from the map // we can't remove SubCo here for: // 1. reduce contention // 2. avoid dashmap dead lock when hold item reference //    while other thread is removing the item while ! self . co_map . is_empty ( ) { std :: thread :: yield_now ( ) ; } }
when parent exit would call this drop
when parent exit would call this drop
&mut self
&mut self