chiark / gitweb /
DTRT if /_/updates is too old
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 6 Sep 2020 21:38:44 +0000 (22:38 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 6 Sep 2020 21:38:44 +0000 (22:38 +0100)
src/global.rs
src/sse.rs
src/updates.rs

index 31bacd456a0eedf6e53130398fd5af3c1a704921..71e050bb9ac3a48d6eee6f0217083476a4fcac8d 100644 (file)
@@ -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(
index 0f20c011501a972fc7d968bcf7eb0f4e9c58b14f..ecf418e249abc17538442fb369dddc1e302b958b 100644 (file)
@@ -220,7 +220,7 @@ pub fn content(iad : InstanceAccessDetails<ClientId>, 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 },
       };
     
index d8f50fff5f2cfa5b616cec1fc052702686d3eb63..1f9c89b65d01b31642765f2fa92f11e2818d1427 100644 (file)
@@ -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<PreparedUpdate>,
+}
+
+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<U: Into<Arc<PreparedUpdate>>>(&mut self, update: U) {
     self.log.push_back(update.into());
     self.cv.notify_all();