Skip to content

Commit 1359bbd

Browse files
committed
Drop span maps on a background thread
1 parent 917734c commit 1359bbd

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

crates/span/src/map.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,38 @@ 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(Box::<[(TextSize, SpanData<S>)]>::into_raw(
178+
std::mem::take(&mut self.spans).into_boxed_slice(),
179+
)))
180+
},
181+
|b: SendPtr| {
182+
_ = unsafe {
183+
Box::from_raw(std::mem::transmute::<_, *mut [(TextSize, SpanData<S>)]>(b.0))
184+
}
185+
},
186+
))
187+
.unwrap();
188+
}
189+
}
190+
159191
#[derive(PartialEq, Eq, Hash, Debug)]
160192
pub struct RealSpanMap {
161193
file_id: EditionedFileId,

0 commit comments

Comments
 (0)