server main: replace db_pool_index Mutex with AtomicUsize
This commit is contained in:
parent
2402721226
commit
ebf76784e7
|
@ -4,7 +4,7 @@
|
||||||
extern crate gotham_derive;
|
extern crate gotham_derive;
|
||||||
|
|
||||||
use core::f64::consts::PI;
|
use core::f64::consts::PI;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}, Mutex};
|
||||||
use gotham::{
|
use gotham::{
|
||||||
handler::assets::FileOptions,
|
handler::assets::FileOptions,
|
||||||
router::builder::{DefineSingleRoute, DrawRoutes},
|
router::builder::{DefineSingleRoute, DrawRoutes},
|
||||||
|
@ -24,18 +24,21 @@ mod tiles;
|
||||||
#[derive(Clone, StateData)]
|
#[derive(Clone, StateData)]
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
pub db_pool: Vec<Arc<Mutex<postgres::Client>>>,
|
pub db_pool: Vec<Arc<Mutex<postgres::Client>>>,
|
||||||
pub db_pool_index: Arc<Mutex<usize>>,
|
pub db_pool_index: Arc<AtomicUsize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
pub fn with_db<F: Fn(&mut postgres::Client) -> R, R>(&self, f: F) -> R {
|
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 db_pool_len = self.db_pool.len();
|
||||||
let mut db = self.db_pool[*db_pool_index].lock().unwrap();
|
let db_pool_index = self.db_pool_index.fetch_update(
|
||||||
|
Ordering::SeqCst, Ordering::SeqCst, |mut db_pool_index| {
|
||||||
*db_pool_index += 1;
|
db_pool_index += 1;
|
||||||
if *db_pool_index >= self.db_pool.len() {
|
if db_pool_index >= db_pool_len {
|
||||||
*db_pool_index = 0;
|
db_pool_index = 0;
|
||||||
}
|
}
|
||||||
|
Some(db_pool_index)
|
||||||
|
}).unwrap();
|
||||||
|
let mut db = self.db_pool[db_pool_index].lock().unwrap();
|
||||||
|
|
||||||
f(&mut db)
|
f(&mut db)
|
||||||
}
|
}
|
||||||
|
@ -136,7 +139,7 @@ fn main() {
|
||||||
|
|
||||||
let state = AppState {
|
let state = AppState {
|
||||||
db_pool,
|
db_pool,
|
||||||
db_pool_index: Arc::new(Mutex::new(0)),
|
db_pool_index: Arc::new(AtomicUsize::new(0)),
|
||||||
};
|
};
|
||||||
let (chain, pipelines) = single_pipeline(
|
let (chain, pipelines) = single_pipeline(
|
||||||
single_middleware(
|
single_middleware(
|
||||||
|
|
Loading…
Reference in New Issue