Merge pull request #21355 from Veykril/push-zkmupnykkvln

perf: Reduce channel lock contention for drop-threads
This commit is contained in:
Lukas Wirth 2025-12-28 10:57:22 +00:00 committed by GitHub
commit a3bf20fa00
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 2 deletions

View File

@ -163,7 +163,22 @@ impl Drop for SpanMap {
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)))
.spawn(move || {
loop {
// block on a receive
if let Ok((b, drop)) = receiver.recv() {
drop(b);
}
// then drain the entire channel
while let Ok((b, drop)) = receiver.try_recv() {
drop(b);
}
// and sleep for a bit
std::thread::sleep(std::time::Duration::from_millis(100));
}
// why do this over just a `receiver.iter().for_each(drop)`? To reduce contention on the channel lock.
// otherwise this thread will constantly wake up and sleep again.
})
.unwrap();
sender
})

View File

@ -218,7 +218,18 @@ impl<T> Drop for Parse<T> {
let (sender, receiver) = std::sync::mpsc::channel::<GreenNode>();
std::thread::Builder::new()
.name("ParseNodeDropper".to_owned())
.spawn(move || receiver.iter().for_each(drop))
.spawn(move || {
loop {
// block on a receive
_ = receiver.recv();
// then drain the entire channel
while let Ok(_) = receiver.try_recv() {}
// and sleep for a bit
std::thread::sleep(std::time::Duration::from_millis(100));
}
// why do this over just a `receiver.iter().for_each(drop)`? To reduce contention on the channel lock.
// otherwise this thread will constantly wake up and sleep again.
})
.unwrap();
sender
})