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
//! The `join` macro. /// Polls multiple futures simultaneously, returning a tuple /// of all results once complete. /// /// While `join!(a, b)` is similar to `(await!(a), await!(b))`, /// `join!` polls both futures concurrently and therefore is more efficent. /// /// This macro is only usable inside of async functions, closures, and blocks. /// /// # Examples /// /// ``` /// #![feature(pin, async_await, await_macro, futures_api)] /// # futures::executor::block_on(async { /// use futures::{join, future}; /// /// let a = future::ready(1); /// let b = future::ready(2); /// /// assert_eq!(join!(a, b), (1, 2)); /// # }); /// ``` #[macro_export] macro_rules! join { ($($fut:ident),*) => { { $( let mut $fut = $crate::future::maybe_done($fut); $crate::pin_mut!($fut); )* loop { let mut all_done = true; $( if let $crate::core_reexport::task::Poll::Pending = $crate::poll!($fut.reborrow()) { all_done = false; } )* if all_done { break; } else { $crate::pending!(); } } ($( $fut.reborrow().take_output().unwrap(), )*) } } }