server main: replace db_pool_index Mutex with AtomicUsize

This commit is contained in:
Astro 2021-08-28 19:21:22 +02:00
parent 2402721226
commit ebf76784e7
1 changed files with 13 additions and 10 deletions

View File

@ -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<Arc<Mutex<postgres::Client>>>,
pub db_pool_index: Arc<Mutex<usize>>,
pub db_pool_index: Arc<AtomicUsize>,
}
impl AppState {
pub fn with_db<F: Fn(&mut postgres::Client) -> 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(