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 | |