mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-12-27 16:07:46 +00:00
Drop span maps on a background thread
This commit is contained in:
parent
917734c43b
commit
5d7a7a3e13
@ -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) {
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user