runtime: move block_in_place setup into a non-generic function (#8315)

This commit is contained in:
Geoffry Song
2026-07-30 11:05:04 +02:00
committed by GitHub
parent 4308c74a65
commit dc48a05132
@@ -402,10 +402,32 @@ where
}
}
// Move the runtime to another thread, if there is one to move.
// Do this in a non-generic function that doesn't depend on `F` or `R`.
let (had_entered, take_core) = match maybe_move_runtime() {
Ok(r) => r,
Err(panic_message) => panic!("{}", panic_message),
};
if had_entered {
// Unset the current task's budget. Blocking sections are not
// constrained by task budgets.
let _reset = Reset {
take_core,
budget: coop::stop(),
};
crate::runtime::context::exit_runtime(f)
} else {
f()
}
}
fn maybe_move_runtime() -> Result<(bool, bool), &'static str> {
let mut had_entered = false;
let mut take_core = false;
let setup_result = with_current(|maybe_cx| {
with_current(|maybe_cx| {
match (
crate::runtime::context::current_enter_context(),
maybe_cx.is_some(),
@@ -488,24 +510,8 @@ where
let worker = cx.worker.clone();
runtime::spawn_blocking(move || run(worker));
Ok(())
});
if let Err(panic_message) = setup_result {
panic!("{}", panic_message);
}
if had_entered {
// Unset the current task's budget. Blocking sections are not
// constrained by task budgets.
let _reset = Reset {
take_core,
budget: coop::stop(),
};
crate::runtime::context::exit_runtime(f)
} else {
f()
}
})?;
Ok((had_entered, take_core))
}
impl Launch {