1use std::future::Future;
5
6use fedimint_logging::LOG_RUNTIME;
7pub use n0_future::task::{JoinError, JoinHandle};
8pub use n0_future::time::{Duration, Elapsed, Instant, sleep, sleep_until, timeout};
9use tracing::{Instrument, Span};
10
11use crate::task::MaybeSend;
12
13pub fn spawn<F, T>(name: &str, future: F) -> JoinHandle<T>
14where
15 F: Future<Output = T> + 'static + MaybeSend,
16 T: MaybeSend + 'static,
17{
18 let span = tracing::debug_span!(target: LOG_RUNTIME, parent: None, "spawn", task = name);
19 n0_future::task::spawn(future.instrument(span))
20}
21
22pub fn spawn_with_span<F, T>(parent: &Span, name: &str, future: F) -> JoinHandle<T>
28where
29 F: Future<Output = T> + 'static + MaybeSend,
30 T: MaybeSend + 'static,
31{
32 let span = tracing::debug_span!(target: LOG_RUNTIME, parent: parent, "spawn", task = name);
33 n0_future::task::spawn(future.instrument(span))
34}
35
36#[cfg(not(target_family = "wasm"))]
39pub fn block_in_place<F, R>(f: F) -> R
40where
41 F: FnOnce() -> R,
42{
43 tokio::task::block_in_place(f)
45}
46
47#[cfg(not(target_family = "wasm"))]
48pub fn block_on<F: Future>(future: F) -> F::Output {
49 tokio::runtime::Handle::current().block_on(future)
51}