chiark / gitweb /
make PlayerUpdates more opaque
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 21:59:42 +0000 (22:59 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 21:59:42 +0000 (22:59 +0100)
src/sse.rs
src/updates.rs

index f4d0b2812d604ad538c55f8ce83af14087348342..ed2d5aac249e9a0c3f8e146b527eadf2c26bf831 100644 (file)
@@ -47,14 +47,12 @@ impl Read for UpdateReader {
     let pu = &mut ig.updates.get(self.player)
       .ok_or_else(|| em("player gonee"))?;
 
-    let cv = pu.cv.clone();
-
-    loop {
-      let next = match pu.log.get(self.to_send) {
-        Some(next) => next,  None => { break }
+    let cv = loop {
+      let next = match pu.get_or_cv(self.to_send) {
+        Ok(next) => next,  Err(cv) => { break cv }
       };
       let next_len = UPDATE_MAX_FRAMING_SIZE + next.json_len();
-      if next_len > buf.len() { break }
+      if next_len > buf.len() { break pu.get_cv() }
 
       let tu = next.for_transmit(self.client);
       // xxx handle overflow by allocating
@@ -64,7 +62,7 @@ impl Read for UpdateReader {
                    id: {}\n\n",
              &self.to_send)?;
       self.to_send.try_increment().unwrap();
-    }
+    };
 
     loop {
       let generated = orig_wanted - buf.len();
@@ -138,7 +136,7 @@ eprintln!("updates content iad={:?} player={:?} cl={:?} updates={:?}",
           &iad, &player, &cl, &g.updates);
     let gref = iad.gref.clone();
 
-    let log = &g.updates.byid(player)?.log;
+    let log = &g.updates.byid(player)?.read_log();
 
     let to_send = match log.into_iter().rev()
       .find(|(_,update)| update.gen <= gen) {
index ec08fc7ec9bf95302d76ac4d992f23cd6ea5722e..e93fa6c4a6d1a3d98addb426f2fcd60a1180d310 100644 (file)
@@ -12,10 +12,13 @@ const RECENT_BUFFER : usize = 50;
 
 // ---------- prepared updates, queued in memory ----------
 
+pub type PlayerUpdatesLog =
+  StableIndexVecDeque<Arc<PreparedUpdate>,sse::UpdateId>;
+
 #[derive(Debug)]
 pub struct PlayerUpdates {
-  pub log : StableIndexVecDeque<Arc<PreparedUpdate>,sse::UpdateId>,
-  pub cv : Arc<Condvar>,
+  log : PlayerUpdatesLog,
+  cv : Arc<Condvar>,
 }
 
 #[derive(Debug)]
@@ -95,6 +98,13 @@ impl PlayerUpdates {
     self.log.push_back(update.into());
     self.cv.notify_all();
   }
+  pub fn read_log(&self) -> &PlayerUpdatesLog { &self.log }
+
+  pub fn get_or_cv(&self, index: sse::UpdateId)
+                   -> Result<&Arc<PreparedUpdate>,Arc<Condvar>> {
+    self.log.get(index).ok_or_else(|| self.cv.clone())
+  }
+  pub fn get_cv(&self) -> Arc<Condvar> { self.cv.clone() }
 }
 
 impl PreparedUpdate {