1 cfg_rt! { 2 pub(crate) use crate::runtime::spawn_blocking; 3 4 cfg_fs! { 5 #[allow(unused_imports)] 6 pub(crate) use crate::runtime::spawn_mandatory_blocking; 7 } 8 9 pub(crate) use crate::task::JoinHandle; 10 } 11 12 cfg_not_rt! { 13 use std::fmt; 14 use std::future::Future; 15 use std::pin::Pin; 16 use std::task::{Context, Poll}; 17 18 pub(crate) fn spawn_blocking<F, R>(_f: F) -> JoinHandle<R> 19 where 20 F: FnOnce() -> R + Send + 'static, 21 R: Send + 'static, 22 { 23 assert_send_sync::<JoinHandle<std::cell::Cell<()>>>(); 24 panic!("requires the `rt` Tokio feature flag") 25 } 26 27 cfg_fs! { 28 pub(crate) fn spawn_mandatory_blocking<F, R>(_f: F) -> Option<JoinHandle<R>> 29 where 30 F: FnOnce() -> R + Send + 'static, 31 R: Send + 'static, 32 { 33 panic!("requires the `rt` Tokio feature flag") 34 } 35 } 36 37 pub(crate) struct JoinHandle<R> { 38 _p: std::marker::PhantomData<R>, 39 } 40 41 unsafe impl<T: Send> Send for JoinHandle<T> {} 42 unsafe impl<T: Send> Sync for JoinHandle<T> {} 43 44 impl<R> Future for JoinHandle<R> { 45 type Output = Result<R, std::io::Error>; 46 47 fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> { 48 unreachable!() 49 } 50 } 51 52 impl<T> fmt::Debug for JoinHandle<T> 53 where 54 T: fmt::Debug, 55 { 56 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { 57 fmt.debug_struct("JoinHandle").finish() 58 } 59 } 60 61 fn assert_send_sync<T: Send + Sync>() { 62 } 63 } 64