Skip to content

Commit 5d7a7a3

Browse files
committed
Drop span maps on a background thread
1 parent 917734c commit 5d7a7a3

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

crates/project-model/src/workspace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ fn add_target_crate_root(
16191619

16201620
let mut env = cargo.env().clone();
16211621
inject_cargo_package_env(&mut env, pkg);
1622-
inject_cargo_env(&mut env, &cargo_path);
1622+
inject_cargo_env(&mut env, cargo_path);
16231623
inject_rustc_tool_env(&mut env, cargo_crate_name, kind);
16241624

16251625
if let Some(envs) = build_data.map(|(it, _)| &it.envs) {

crates/span/src/map.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,43 @@ where
156156
}
157157
}
158158

159+
impl<S> Drop for SpanMap<S> {
160+
fn drop(&mut self) {
161+
struct SendPtr(*mut [()]);
162+
unsafe impl Send for SendPtr {}
163+
static SPAN_MAP_DROP_THREAD: std::sync::OnceLock<
164+
std::sync::mpsc::Sender<(SendPtr, fn(SendPtr))>,
165+
> = std::sync::OnceLock::new();
166+
SPAN_MAP_DROP_THREAD
167+
.get_or_init(|| {
168+
let (sender, receiver) = std::sync::mpsc::channel::<(SendPtr, fn(SendPtr))>();
169+
std::thread::Builder::new()
170+
.name("SpanMapDropper".to_owned())
171+
.spawn(move || receiver.iter().for_each(|(b, drop)| drop(b)))
172+
.unwrap();
173+
sender
174+
})
175+
.send((
176+
unsafe {
177+
SendPtr(std::mem::transmute::<*mut [(TextSize, SpanData<S>)], *mut [()]>(
178+
Box::<[(TextSize, SpanData<S>)]>::into_raw(
179+
std::mem::take(&mut self.spans).into_boxed_slice(),
180+
),
181+
))
182+
},
183+
|b: SendPtr| {
184+
_ = unsafe {
185+
Box::from_raw(std::mem::transmute::<
186+
*mut [()],
187+
*mut [(TextSize, SpanData<S>)],
188+
>(b.0))
189+
}
190+
},
191+
))
192+
.unwrap();
193+
}
194+
}
195+
159196
#[derive(PartialEq, Eq, Hash, Debug)]
160197
pub struct RealSpanMap {
161198
file_id: EditionedFileId,

0 commit comments

Comments
 (0)