From 6f5e46c03a5c7e75d0179e0ecb481c001640b262 Mon Sep 17 00:00:00 2001 From: amv-dev Date: Sat, 3 Apr 2021 22:30:44 +0500 Subject: [PATCH] refactor: reduced atomics usage in Pool There is no reason to `min` and `max` properties of Pool to be an atomic type, because they can't be updated since Pool's creation. So we can use regular `usize` instead which will be more performant. --- src/conn/pool.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/conn/pool.rs b/src/conn/pool.rs index 510fca0..3215d4c 100644 --- a/src/conn/pool.rs +++ b/src/conn/pool.rs @@ -57,8 +57,8 @@ impl InnerPool { struct ArcedPool { inner: (Mutex, Condvar), - min: AtomicUsize, - max: AtomicUsize, + min: usize, + max: usize, count: AtomicUsize, } @@ -150,7 +150,7 @@ impl Pool { if let Some(conn) = pool.pool.pop_front() { drop(pool); break conn; - } else if self.arced_pool.count.load(Ordering::Relaxed) < self.arced_pool.max.load(Ordering::Relaxed) { + } else if self.arced_pool.count.load(Ordering::Relaxed) < self.arced_pool.max { pool.new_conn()?; self.arced_pool.count.fetch_add(1, Ordering::SeqCst); } else { @@ -190,8 +190,8 @@ impl Pool { Ok(Pool { arced_pool: Arc::new(ArcedPool { inner: (Mutex::new(pool), Condvar::new()), - min: AtomicUsize::new(min), - max: AtomicUsize::new(max), + min, + max, count: AtomicUsize::new(min), }), use_cache: true, @@ -249,8 +249,8 @@ impl fmt::Debug for Pool { write!( f, "Pool {{ min: {}, max: {}, count: {} }}", - self.arced_pool.min.load(Ordering::Relaxed), - self.arced_pool.max.load(Ordering::Relaxed), + self.arced_pool.min, + self.arced_pool.max, self.arced_pool.count.load(Ordering::Relaxed) ) } @@ -304,7 +304,7 @@ impl Deref for PooledConn { impl Drop for PooledConn { fn drop(&mut self) { - if self.pool.arced_pool.count.load(Ordering::Relaxed) > self.pool.arced_pool.max.load(Ordering::Relaxed) + if self.pool.arced_pool.count.load(Ordering::Relaxed) > self.pool.arced_pool.max || self.conn.is_none() { self.pool.arced_pool.count.fetch_sub(1, Ordering::SeqCst);