From: Ian Jackson Date: Sun, 23 Aug 2020 00:06:57 +0000 (+0100) Subject: fixes X-Git-Tag: otter-0.2.0~1087 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e4b2ca520bfc5c3e25a96ac9c90241f0d0a7c409;p=otter.git fixes --- diff --git a/.gitignore b/.gitignore index b1df170d..81a69249 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ templates/script.js +save/lock diff --git a/src/global.rs b/src/global.rs index ac40901a..9bbcf90a 100644 --- a/src/global.rs +++ b/src/global.rs @@ -143,6 +143,7 @@ struct Global { players : RwLock>, clients : RwLock>, config : RwLock>, + save_area_lock : Mutex>, // xxx delete clients at some point! } @@ -606,9 +607,20 @@ impl InstanceGuard<'_> { rmp_serde::decode::from_read(&mut f)? } - #[throws(OE)] + #[throws(StartupError)] pub fn load(name: InstanceName) -> InstanceRef { - // xxx should take a file lock on save area + { + let mut st = GLOBAL.save_area_lock.lock().unwrap(); + let st = &mut *st; + if st.is_none() { + let lockfile = format!("{}/lock", config().save_directory); + *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")?); + } + } // xxx check for deleted players, throw their tokens away let gs = { let mut gs : GameState = Self::load_something(&name, "g-")?; diff --git a/src/imports.rs b/src/imports.rs index c1959f71..5700f367 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -61,6 +61,8 @@ pub use index_vec::{define_index_type,index_vec,IndexVec,IndexSlice}; pub use vecdeque_stableix::StableIndexVecDeque; +pub use fs2::FileExt; + pub use crate::global::*; pub use crate::gamestate::*; pub use crate::pieces::*;