From c3514605004c363dceb85a75f02aa56a982c7f7a Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 31 Jul 2020 22:59:42 +0100 Subject: [PATCH] make PlayerUpdates more opaque --- src/sse.rs | 14 ++++++-------- src/updates.rs | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/sse.rs b/src/sse.rs index f4d0b281..ed2d5aac 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -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) { diff --git a/src/updates.rs b/src/updates.rs index ec08fc7e..e93fa6c4 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -12,10 +12,13 @@ const RECENT_BUFFER : usize = 50; // ---------- prepared updates, queued in memory ---------- +pub type PlayerUpdatesLog = + StableIndexVecDeque,sse::UpdateId>; + #[derive(Debug)] pub struct PlayerUpdates { - pub log : StableIndexVecDeque,sse::UpdateId>, - pub cv : Arc, + log : PlayerUpdatesLog, + cv : Arc, } #[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,Arc> { + self.log.get(index).ok_or_else(|| self.cv.clone()) + } + pub fn get_cv(&self) -> Arc { self.cv.clone() } } impl PreparedUpdate { -- 2.30.2