#[derive(Debug,Clone)]
pub struct ServerConfig {
- pub save_dir: String,
+ save_dir: String,
pub command_socket: String,
pub debug: bool,
pub http_port: Option<u16>,
let config = config.try_into()?;
set_config(config);
}
+
+ #[throws(AE)]
+ pub fn lock_save_area(&self) {
+ let mut st = GLOBAL.save_area_lock.lock().unwrap();
+ let st = &mut *st;
+ if st.is_none() {
+ let lockfile = format!("{}/lock", config().save_dir);
+ *st = Some((||{
+ let file = File::create(&lockfile).context("open")?;
+ file.try_lock_exclusive().context("lock")?;
+ Ok::<_,AE>(file)
+ })().context(lockfile).context("lock global save area")?);
+ }
+ }
+
+ pub fn save_dir(&self) -> &String {
+ let st = GLOBAL.save_area_lock.lock().unwrap();
+ let mut _f : &File = st.as_ref().unwrap();
+ &self.save_dir
+ }
}
impl Default for ServerConfig {
// (perf impact); outermost first, innermost last)
// slow global locks:
- save_area_lock: Mutex<Option<File>>,
+ pub save_area_lock: Mutex<Option<File>>,
// <- accounts::accounts ->
games_table: RwLock<GamesTable>,
}
fn savefilename(name: &InstanceName, prefix: &str, suffix: &str) -> String {
- [ config().save_dir.as_str(), &"/", prefix ]
+ [ config().save_dir().as_str(), &"/", prefix ]
.iter().map(Deref::deref)
.chain(iter::once( name.to_string().as_str() ))
.chain([ suffix ].iter().map(Deref::deref))
fn load_game(accounts: &AccountsGuard,
games: &mut GamesGuard,
name: InstanceName) -> Option<InstanceRef> {
- {
- let mut st = GLOBAL.save_area_lock.lock().unwrap();
- let st = &mut *st;
- if st.is_none() {
- let lockfile = format!("{}/lock", config().save_dir);
- *st = Some((||{
- let file = File::create(&lockfile).context("open")?;
- file.try_lock_exclusive().context("lock")?;
- Ok::<_,AE>(file)
- })().context(lockfile).context("lock global save area")?);
- }
- }
-
let InstanceSaveAccesses::<String,ActualPiecesLoaded>
{ tokens_players, mut ipieces, mut aplayers, acl }
= match Self::load_something(&name, "a-") {
use AFState::*;
use SavefilenameParseResult::*;
let mut a_leaves = HashMap::new();
- for de in fs::read_dir(&config().save_dir)? {
+ for de in fs::read_dir(&config().save_dir())? {
let de = de?;
let leaf = de.file_name();
(||{