pub pieces : Pieces,
pub players : PlayerMap,
pub gen : Generation,
- pub log : Vec<(Generation, Arc<CommittedLogEntry>)>, // xxx expiry
+ pub log : VecDeque<(Generation, Arc<CommittedLogEntry>)>, // xxx expiry
pub max_z : ZCoord,
}
// ---------- game state - rendering etc. ----------
-
impl PieceState {
#[throws(IE)]
pub fn prep_piecestate(&self, p: &dyn Piece, pri : &PieceRenderInstructions)
}
}
+// ---------- log expiry ==========
+
+impl GameState {
+ pub fn expire_old_logs(&mut self, cutoff: Timestamp) {
+ fn want_trim(gs: &GameState, cutoff: Timestamp) -> bool {
+ (||{
+ let e = gs.log.get(1)?;
+ (e.1.when < cutoff).as_option()
+ })().is_some()
+ };
+
+ if want_trim(self, cutoff) {
+ while want_trim(self, cutoff) {
+ self.log.pop_front();
+ }
+ let front = self.log.front_mut().unwrap();
+ let front = &mut front.1;
+ let logent = LogEntry {
+ html: Html::lit("Earlier log entries expired."),
+ };
+ *front = Arc::new(CommittedLogEntry { logent, when: front.when });
+ }
+ }
+}
+
// ========== ad-hoc and temporary ==========
pub fn make_pieceid_visible(p : PieceId) -> VisiblePieceId {
const GAME_SAVE_LAG : Duration = Duration::from_millis(500);
+const MAX_LOG_AGE : Duration = Duration::from_secs(10 * 86400);
+
#[derive(Hash,Ord,PartialOrd,Eq,PartialEq,Serialize)]
#[repr(transparent)]
pub struct RawTokenVal(str);
pub use std::process::exit;
pub use std::borrow::Cow;
+pub use boolinator::Boolinator as _;
+
pub use thiserror::Error;
pub use anyhow::{Context,anyhow};
pub use fehler::{throws,throw};
let now = Timestamp::now();
for logent in logents {
let when = iter::once(now).chain(
- self.g.gs.log.last().map(|l| l.1.when)
+ self.g.gs.log.back().map(|l| l.1.when)
).max().unwrap();
let logent = Arc::new(CommittedLogEntry { when, logent });
let gen = self.gen();
- self.g.gs.log.push((gen, logent.clone()));
+ self.g.gs.log.push_back((gen, logent.clone()));
self.us.push(PreparedUpdateEntry::Log(logent));
}
}