Drop span maps on a background thread

This commit is contained in:
Lukas Wirth 2025-11-17 14:23:03 +01:00
parent 917734c43b
commit 5d7a7a3e13
2 changed files with 38 additions and 1 deletions

View File

@ -1619,7 +1619,7 @@ fn add_target_crate_root(
let mut env = cargo.env().clone();
inject_cargo_package_env(&mut env, pkg);
inject_cargo_env(&mut env, &cargo_path);
inject_cargo_env(&mut env, cargo_path);
inject_rustc_tool_env(&mut env, cargo_crate_name, kind);
if let Some(envs) = build_data.map(|(it, _)| &it.envs) {

View File

@ -156,6 +156,43 @@ where
}
}
impl<S> Drop for SpanMap<S> {
fn drop(&mut self) {
struct SendPtr(*mut [()]);
unsafe impl Send for SendPtr {}
static SPAN_MAP_DROP_THREAD: std::sync::OnceLock<
std::sync::mpsc::Sender<(SendPtr, fn(SendPtr))>,
> = std::sync::OnceLock::new();
SPAN_MAP_DROP_THREAD
.get_or_init(|| {
let (sender, receiver) = std::sync::mpsc::channel::<(SendPtr, fn(SendPtr))>();
std::thread::Builder::new()
.name("SpanMapDropper".to_owned())
.spawn(move || receiver.iter().for_each(|(b, drop)| drop(b)))
.unwrap();
sender
})
.send((
unsafe {
SendPtr(std::mem::transmute::<*mut [(TextSize, SpanData<S>)], *mut [()]>(
Box::<[(TextSize, SpanData<S>)]>::into_raw(
std::mem::take(&mut self.spans).into_boxed_slice(),
),
))
},
|b: SendPtr| {
_ = unsafe {
Box::from_raw(std::mem::transmute::<
*mut [()],
*mut [(TextSize, SpanData<S>)],
>(b.0))
}
},
))
.unwrap();
}
}
#[derive(PartialEq, Eq, Hash, Debug)]
pub struct RealSpanMap {
file_id: EditionedFileId,