rt: avoid cloning runtime::Handle in spawn (#5724)

This commit updates `tokio::spawn` to avoid having to clone
`runtime::Handle`.
This commit is contained in:
Carl Lerche
2023-05-26 08:08:53 -07:00
committed by GitHub
parent 5e6d4c7999
commit d274ef3748
5 changed files with 20 additions and 11 deletions
+7 -3
View File
@@ -182,9 +182,13 @@ cfg_rt! {
CONTEXT.try_with(|ctx| ctx.current_task_id.get()).unwrap_or(None) CONTEXT.try_with(|ctx| ctx.current_task_id.get()).unwrap_or(None)
} }
pub(crate) fn try_current() -> Result<scheduler::Handle, TryCurrentError> { pub(crate) fn with_current<F, R>(f: F) -> Result<R, TryCurrentError>
match CONTEXT.try_with(|ctx| ctx.handle.borrow().clone()) { where
Ok(Some(handle)) => Ok(handle), F: FnOnce(&scheduler::Handle) -> R,
{
match CONTEXT.try_with(|ctx| ctx.handle.borrow().as_ref().map(f)) {
Ok(Some(ret)) => Ok(ret),
Ok(None) => Err(TryCurrentError::new_no_context()), Ok(None) => Err(TryCurrentError::new_no_context()),
Err(_access_error) => Err(TryCurrentError::new_thread_local_destroyed()), Err(_access_error) => Err(TryCurrentError::new_thread_local_destroyed()),
} }
+2 -2
View File
@@ -200,9 +200,9 @@ cfg_coop! {
cfg_metrics! { cfg_metrics! {
#[inline(always)] #[inline(always)]
fn inc_budget_forced_yield_count() { fn inc_budget_forced_yield_count() {
if let Ok(handle) = context::try_current() { let _ = context::with_current(|handle| {
handle.scheduler_metrics().inc_budget_forced_yield_count(); handle.scheduler_metrics().inc_budget_forced_yield_count();
} });
} }
} }
+3 -1
View File
@@ -109,7 +109,9 @@ impl Handle {
/// ///
/// Contrary to `current`, this never panics /// Contrary to `current`, this never panics
pub fn try_current() -> Result<Self, TryCurrentError> { pub fn try_current() -> Result<Self, TryCurrentError> {
context::try_current().map(|inner| Handle { inner }) context::with_current(|inner| Handle {
inner: inner.clone(),
})
} }
/// Spawns a future onto the Tokio runtime. /// Spawns a future onto the Tokio runtime.
+1 -1
View File
@@ -52,7 +52,7 @@ cfg_rt! {
impl Handle { impl Handle {
#[track_caller] #[track_caller]
pub(crate) fn current() -> Handle { pub(crate) fn current() -> Handle {
match context::try_current() { match context::with_current(Clone::clone) {
Ok(handle) => handle, Ok(handle) => handle,
Err(e) => panic!("{}", e), Err(e) => panic!("{}", e),
} }
+7 -4
View File
@@ -1,4 +1,3 @@
use crate::runtime::Handle;
use crate::task::JoinHandle; use crate::task::JoinHandle;
use std::future::Future; use std::future::Future;
@@ -178,7 +177,8 @@ cfg_rt! {
T: Future + Send + 'static, T: Future + Send + 'static,
T::Output: Send + 'static, T::Output: Send + 'static,
{ {
use crate::runtime::task; use crate::runtime::{context, task};
#[cfg(all( #[cfg(all(
tokio_unstable, tokio_unstable,
tokio_taskdump, tokio_taskdump,
@@ -193,7 +193,10 @@ cfg_rt! {
let future = task::trace::Trace::root(future); let future = task::trace::Trace::root(future);
let id = task::Id::next(); let id = task::Id::next();
let task = crate::util::trace::task(future, "task", name, id.as_u64()); let task = crate::util::trace::task(future, "task", name, id.as_u64());
let handle = Handle::current();
handle.inner.spawn(task, id) match context::with_current(|handle| handle.spawn(task, id)) {
Ok(join_handle) => join_handle,
Err(e) => panic!("{}", e),
}
} }
} }