From e805992bb16fd374a82c31a1e697b7a2a48d64de Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 31 Jan 2024 15:39:51 -0600 Subject: [PATCH] Performance changes --- src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 396b368..6e9190f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,7 @@ use std::{ }, }; -use rand::{seq::SliceRandom, thread_rng}; +use nanorand::Rng; use rustls::sign::CertifiedKey; /// Create a new resolver channel. The Sender can update the key, and the Receiver can be @@ -64,11 +64,11 @@ impl sealed::Shard { } fn update(&self, key: CertifiedKey) { - let mut guard = self.lock.write().unwrap(); - // update generation while lock is held - ensures any "after" accesses to generation queue - // at the read-lock for a new key - self.generation.fetch_add(1, Ordering::Release); - *guard = Arc::new(key); + { + *self.lock.write().unwrap() = Arc::new(key); + } + // update generation after lock is released. reduces lock contention with readers + self.generation.fetch_add(1, Ordering::AcqRel); } fn read(&self) -> Arc { @@ -124,7 +124,7 @@ impl ChannelResolver { #[doc(hidden)] pub fn read(&self) -> Arc { // choose random shard to reduce contention. unwrap since slice is always non-empty - self.locks.choose(&mut thread_rng()).unwrap().read() + self.locks[nanorand::tls_rng().generate_range(0..SHARDS)].read() } }