mahjong_service/http_server/
base.rs

1#![allow(clippy::await_holding_lock)]
2use crate::common::Storage;
3use crate::socket::MahjongWebsocketServer;
4use actix::prelude::*;
5use actix_web::web;
6use mahjong_core::GameId;
7use rustc_hash::FxHashMap;
8use std::sync::{Arc, Mutex};
9
10pub type DataStorage = web::Data<Arc<Box<dyn Storage>>>;
11pub type DataSocketServer = web::Data<Arc<Mutex<Addr<MahjongWebsocketServer>>>>;
12
13#[derive(Default)]
14pub struct GamesManager {
15    games_locks: FxHashMap<GameId, Arc<Mutex<()>>>,
16}
17
18impl GamesManager {
19    pub fn get_game_mutex(&mut self, game_id: &GameId) -> Arc<Mutex<()>> {
20        let mutex_arc = self
21            .games_locks
22            .entry(game_id.clone())
23            .or_insert(Arc::new(Mutex::new(())));
24
25        mutex_arc.clone()
26    }
27}
28
29pub type GamesManagerData = web::Data<Arc<Mutex<GamesManager>>>;
30
31macro_rules! get_lock {
32    ($manager:expr, $game_id:expr) => {
33        let game_lock = { $manager.lock().unwrap().get_game_mutex(&$game_id) };
34        let _game_lock = game_lock.lock().unwrap();
35    };
36}
37
38pub(crate) use get_lock;