From 7a5df33c85856a9727b3cd6c11aa7c13aa78f870 Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Sun, 14 May 2017 19:50:40 +0900 Subject: [PATCH] issue/148 Wrapping MsQueue to drop all of its concent on Drop --- src/core/pool.rs | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/core/pool.rs b/src/core/pool.rs index 33d04dbeb..eca549139 100644 --- a/src/core/pool.rs +++ b/src/core/pool.rs @@ -10,8 +10,39 @@ pub struct GenerationItem { item: T, } + +// See https://github.com/crossbeam-rs/crossbeam/issues/91 +struct NonLeakingMsQueue { + underlying_queue: MsQueue +} + +impl Default for NonLeakingMsQueue { + fn default() -> NonLeakingMsQueue { + NonLeakingMsQueue { + underlying_queue: MsQueue::new(), + } + } +} + +impl NonLeakingMsQueue { + + fn pop(&self,) -> T { + self.underlying_queue.pop() + } + + fn push(&self, el: T) { + self.underlying_queue.push(el); + } +} + +impl Drop for NonLeakingMsQueue { + fn drop(&mut self) { + while let Some(_popped_item_to_be_dropped) = self.underlying_queue.try_pop() {} + } +} + pub struct Pool { - queue: Arc>>, + queue: Arc>>, freshest_generation: AtomicUsize, next_generation: AtomicUsize, } @@ -20,7 +51,7 @@ impl Pool { pub fn new() -> Pool { Pool { - queue: Arc::new(MsQueue::new()), + queue: Arc::default(), freshest_generation: AtomicUsize::default(), next_generation: AtomicUsize::default(), } @@ -57,7 +88,7 @@ impl Pool { self.freshest_generation.load(Ordering::Acquire) } - pub fn acquire(&self,) -> LeasedItem { + pub fn acquire(&self) -> LeasedItem { let generation = self.generation(); loop { let gen_item = self.queue.pop(); @@ -80,7 +111,7 @@ impl Pool { pub struct LeasedItem { gen_item: Option>, - recycle_queue: Arc>>, + recycle_queue: Arc>>, } impl Deref for LeasedItem {