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 {