From 5b6160548973f89065a847b991e326a5a0e80ad4 Mon Sep 17 00:00:00 2001 From: Austin Jones Date: Sun, 17 Jan 2021 20:22:40 -0500 Subject: [PATCH] Use a lock-free notifier queue --- src/sync/notifier.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/sync/notifier.rs b/src/sync/notifier.rs index c83fa07..b0ac3a1 100644 --- a/src/sync/notifier.rs +++ b/src/sync/notifier.rs @@ -1,23 +1,23 @@ -use std::{collections::LinkedList, sync::Mutex, task::Waker}; +use crossbeam_queue::SegQueue; +use std::task::Waker; #[derive(Debug)] pub struct Notifier { - wakers: Mutex>, + wakers: SegQueue, } impl Notifier { pub fn new() -> Self { Self { - wakers: Mutex::new(LinkedList::new()), + wakers: SegQueue::new(), } } pub fn notify(&self) { - let mut wakers = self.wakers.lock().unwrap(); #[cfg(feature = "debug")] let mut woken = 0usize; - while let Some(waker) = wakers.pop_back() { + while let Some(waker) = self.wakers.pop() { #[cfg(feature = "debug")] { woken += 1; @@ -33,7 +33,6 @@ impl Notifier { } pub fn subscribe(&self, waker: Waker) { - let mut wakers = self.wakers.lock().unwrap(); - wakers.push_front(waker); + self.wakers.push(waker); } }