mirror of
https://github.com/async-rs/async-std.git
synced 2025-01-16 10:49:55 +00:00
commit
e8126633a8
4 changed files with 3 additions and 46 deletions
|
@ -57,7 +57,7 @@ alloc = [
|
||||||
"futures-core/alloc",
|
"futures-core/alloc",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
tokio02 = ["tokio"]
|
tokio02 = ["async-global-executor/tokio02"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-attributes = { version = "1.1.1", optional = true }
|
async-attributes = { version = "1.1.1", optional = true }
|
||||||
|
@ -78,7 +78,7 @@ slab = { version = "0.4.2", optional = true }
|
||||||
surf = { version = "1.0.3", optional = true }
|
surf = { version = "1.0.3", optional = true }
|
||||||
|
|
||||||
[target.'cfg(not(target_os = "unknown"))'.dependencies]
|
[target.'cfg(not(target_os = "unknown"))'.dependencies]
|
||||||
async-global-executor = { version = "1.0.2", optional = true, features = ["async-io"] }
|
async-global-executor = { version = "1.2.1", optional = true, features = ["async-io"] }
|
||||||
async-io = { version = "1.0.1", optional = true }
|
async-io = { version = "1.0.1", optional = true }
|
||||||
blocking = { version = "1.0.0", optional = true }
|
blocking = { version = "1.0.0", optional = true }
|
||||||
futures-lite = { version = "1.0.0", optional = true }
|
futures-lite = { version = "1.0.0", optional = true }
|
||||||
|
|
|
@ -168,7 +168,7 @@ impl Builder {
|
||||||
TaskLocalsWrapper::set_current(&wrapped.tag, || {
|
TaskLocalsWrapper::set_current(&wrapped.tag, || {
|
||||||
let res = if should_run {
|
let res = if should_run {
|
||||||
// The first call should run the executor
|
// The first call should run the executor
|
||||||
crate::task::executor::run(wrapped)
|
async_global_executor::block_on(wrapped)
|
||||||
} else {
|
} else {
|
||||||
futures_lite::future::block_on(wrapped)
|
futures_lite::future::block_on(wrapped)
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
use std::future::Future;
|
|
||||||
|
|
||||||
pub(crate) fn run<F, T>(future: F) -> T
|
|
||||||
where
|
|
||||||
F: Future<Output = T>,
|
|
||||||
{
|
|
||||||
enter(|| async_global_executor::block_on(future))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Enters the tokio context if the `tokio` feature is enabled.
|
|
||||||
fn enter<T>(f: impl FnOnce() -> T) -> T {
|
|
||||||
#[cfg(not(feature = "tokio02"))]
|
|
||||||
return f();
|
|
||||||
|
|
||||||
#[cfg(feature = "tokio02")]
|
|
||||||
{
|
|
||||||
use std::cell::Cell;
|
|
||||||
use tokio::runtime::Runtime;
|
|
||||||
|
|
||||||
thread_local! {
|
|
||||||
/// The level of nested `enter` calls we are in, to ensure that the outermost always
|
|
||||||
/// has a runtime spawned.
|
|
||||||
static NESTING: Cell<usize> = Cell::new(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The global tokio runtime.
|
|
||||||
static RT: once_cell::sync::Lazy<Runtime> = once_cell::sync::Lazy::new(|| Runtime::new().expect("cannot initialize tokio"));
|
|
||||||
|
|
||||||
NESTING.with(|nesting| {
|
|
||||||
let res = if nesting.get() == 0 {
|
|
||||||
nesting.replace(1);
|
|
||||||
RT.enter(f)
|
|
||||||
} else {
|
|
||||||
nesting.replace(nesting.get() + 1);
|
|
||||||
f()
|
|
||||||
};
|
|
||||||
nesting.replace(nesting.get() - 1);
|
|
||||||
res
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -148,8 +148,6 @@ cfg_default! {
|
||||||
mod block_on;
|
mod block_on;
|
||||||
mod builder;
|
mod builder;
|
||||||
mod current;
|
mod current;
|
||||||
#[cfg(not(target_os = "unknown"))]
|
|
||||||
pub(crate) mod executor;
|
|
||||||
mod join_handle;
|
mod join_handle;
|
||||||
mod sleep;
|
mod sleep;
|
||||||
#[cfg(not(target_os = "unknown"))]
|
#[cfg(not(target_os = "unknown"))]
|
||||||
|
|
Loading…
Reference in a new issue