From b0ac0407ada2d899747f3f6220b7b5f36084ba67 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 6 Sep 2020 22:38:44 +0100 Subject: [PATCH] DTRT if /_/updates is too old --- src/global.rs | 8 +++++--- src/sse.rs | 2 +- src/updates.rs | 26 +++++++++++++++++++++----- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/global.rs b/src/global.rs index 31bacd45..71e050bb 100644 --- a/src/global.rs +++ b/src/global.rs @@ -346,7 +346,8 @@ impl InstanceGuard<'_> { e })?; (||{ - self.c.g.updates.insert(player, Default::default()); + let pu_bc = PlayerUpdates::new_begin(&self.c.g.gs); + self.c.g.updates.insert(player, pu_bc.new()); })(); // <- No ?, ensures that IEFE is infallible (barring panics) (player, logentry) } @@ -663,7 +664,7 @@ impl InstanceGuard<'_> { } #[throws(StartupError)] - pub fn load(name: InstanceName) -> InstanceRef { + fn load(name: InstanceName) -> InstanceRef { { let mut st = GLOBAL.save_area_lock.lock().unwrap(); let st = &mut *st; @@ -697,8 +698,9 @@ impl InstanceGuard<'_> { Err(e) })?; let mut updates : SecondarySlotMap<_,_> = Default::default(); + let pu_bc = PlayerUpdates::new_begin(&gs); for player in gs.players.keys() { - updates.insert(player, Default::default()); + updates.insert(player, pu_bc.new()); } let name = Arc::new(name); access_load.tokens_players.retain( diff --git a/src/sse.rs b/src/sse.rs index 0f20c011..ecf418e2 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -220,7 +220,7 @@ pub fn content(iad : InstanceAccessDetails, gen: Generation) let to_send = match log.into_iter().rev() .find(|(_,update)| update.gen <= gen) { - None => log.front_index(), + None => UpdateId::min_value(), Some((mut i,_)) => { i.try_increment(); i }, }; diff --git a/src/updates.rs b/src/updates.rs index d8f50fff..1f9c89b6 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -97,14 +97,30 @@ enum TransmitUpdateEntry<'u> { // ---------- prepared updates, queued in memory ---------- -impl Default for PlayerUpdates { - fn default() -> PlayerUpdates { PlayerUpdates { - log : StableIndexVecDeque::with_capacity(50), - cv : Default::default(), - } } + +pub struct PlayerUpdatesBuildContext { + pub(self) u1: Arc, +} + +impl PlayerUpdatesBuildContext { + pub fn new(&self) -> PlayerUpdates { + let mut log = StableIndexVecDeque::with_capacity(50); + log.push_back(self.u1.clone()); + let cv = Default::default(); + PlayerUpdates { log, cv } + } } impl PlayerUpdates { + pub fn new_begin(gs: &GameState) -> PlayerUpdatesBuildContext { + let u1 = Arc::new(PreparedUpdate { + gen : gs.gen, + when: Instant::now(), + us: vec![], + }); + PlayerUpdatesBuildContext { u1 } + } + pub fn push>>(&mut self, update: U) { self.log.push_back(update.into()); self.cv.notify_all(); -- 2.30.2