From ebf76784e7fe229fe6628b13e933a1ed6d6e6b97 Mon Sep 17 00:00:00 2001 From: Astro Date: Sat, 28 Aug 2021 19:21:22 +0200 Subject: [PATCH] server main: replace db_pool_index Mutex with AtomicUsize --- server/src/main.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 52fa9f1..1a95c6a 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,7 +4,7 @@ extern crate gotham_derive; use core::f64::consts::PI; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, atomic::{AtomicUsize, Ordering}, Mutex}; use gotham::{ handler::assets::FileOptions, router::builder::{DefineSingleRoute, DrawRoutes}, @@ -24,18 +24,21 @@ mod tiles; #[derive(Clone, StateData)] pub struct AppState { pub db_pool: Vec>>, - pub db_pool_index: Arc>, + pub db_pool_index: Arc, } impl AppState { pub fn with_db R, R>(&self, f: F) -> R { - let mut db_pool_index = self.db_pool_index.lock().unwrap(); - let mut db = self.db_pool[*db_pool_index].lock().unwrap(); - - *db_pool_index += 1; - if *db_pool_index >= self.db_pool.len() { - *db_pool_index = 0; - } + let db_pool_len = self.db_pool.len(); + let db_pool_index = self.db_pool_index.fetch_update( + Ordering::SeqCst, Ordering::SeqCst, |mut db_pool_index| { + db_pool_index += 1; + if db_pool_index >= db_pool_len { + db_pool_index = 0; + } + Some(db_pool_index) + }).unwrap(); + let mut db = self.db_pool[db_pool_index].lock().unwrap(); f(&mut db) } @@ -136,7 +139,7 @@ fn main() { let state = AppState { db_pool, - db_pool_index: Arc::new(Mutex::new(0)), + db_pool_index: Arc::new(AtomicUsize::new(0)), }; let (chain, pipelines) = single_pipeline( single_middleware(