From cad3537b27d992bbb40cf3864907f4c117694453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Inf=C3=BChr?= Date: Sun, 30 May 2021 22:24:00 +0200 Subject: [PATCH] add len() to Stealer --- crossbeam-deque/src/deque.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crossbeam-deque/src/deque.rs b/crossbeam-deque/src/deque.rs index 5652dd886..41ba392f3 100644 --- a/crossbeam-deque/src/deque.rs +++ b/crossbeam-deque/src/deque.rs @@ -588,6 +588,27 @@ impl Stealer { b.wrapping_sub(f) <= 0 } + /// Returns the number of tasks in the deque. + /// + /// ``` + /// use crossbeam_deque::Worker; + /// + /// let w = Worker::new_lifo(); + /// let s = w.stealer(); + /// + /// assert_eq!(s.len(), 0); + /// w.push(1); + /// assert_eq!(s.len(), 1); + /// w.push(2); + /// assert_eq!(s.len(), 2); + /// ``` + pub fn len(&self) -> usize { + let f = self.inner.front.load(Ordering::Acquire); + atomic::fence(Ordering::SeqCst); + let b = self.inner.back.load(Ordering::Acquire); + b.wrapping_sub(f).max(0) as usize + } + /// Steals a task from the queue. /// /// # Examples