1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use async_std::task; use async_macros::join; use async_std::sync::{ channel }; use crate::protocol::{ SendValue, End }; use crate::base::{ Session, unsafe_run_session, }; pub async fn run_session ( session : Session < End > ) { let (sender, receiver) = channel(1); let child1 = task::spawn ( async move { unsafe_run_session ( session, (), sender ).await; }); let child2 = task::spawn ( async move { receiver.recv().await.unwrap(); }); join!(child1, child2).await; } pub async fn run_session_with_result < T > ( session : Session < SendValue < T, End > > ) -> T where T: Send + 'static { let (sender, receiver1) = channel(1); let child1 = task::spawn ( async move { unsafe_run_session ( session, (), sender ).await; }); let SendValue ( val, receiver2 ) = receiver1.recv().await.unwrap(); receiver2.recv().await.unwrap(); child1.await; val }