From: Ian Jackson Date: Mon, 23 Nov 2020 19:00:09 +0000 (+0000) Subject: make less of a mess in quitting player X-Git-Tag: otter-0.2.0~377 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=3711968aacb2644c8e0dc7806106fb10b876d0bf;p=otter.git make less of a mess in quitting player Signed-off-by: Ian Jackson --- diff --git a/src/sse.rs b/src/sse.rs index 32d7e2d6..7af8637e 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -31,10 +31,11 @@ struct UpdateReaderWN { struct UpdateReader { wn: UpdateReaderWN, overflow: Option>>, - need_flush : bool, - gref : InstanceRef, - keepalives : Wrapping, - init_confirmation_send : iter::Once<()>, + need_flush: bool, + gref: InstanceRef, + keepalives: Wrapping, + ending_send: Option>>, + init_confirmation_send: iter::Once<()>, } impl Deref for UpdateReader { @@ -74,9 +75,13 @@ impl UpdateReaderWN { impl Read for UpdateReader { fn read(&mut self, orig_buf: &mut [u8]) -> Result { + if let Some(ref mut ending) = self.ending_send { + return ending.read(orig_buf); + } let mut ig = self.gref.lock() .map_err(|e| self.trouble("game corrupted", &e))?; + let orig_wanted = orig_buf.len(); let mut buf = &mut *orig_buf; @@ -86,8 +91,18 @@ impl Read for UpdateReader { self.player, self.client, ig.gs.gen, self.to_send)?; } - let iplayer = &mut ig.iplayers.get_mut(self.player) - .ok_or_else(|| self.trouble("player gonee",()))?; + let iplayer = &mut match ig.iplayers.get_mut(self.player) { + Some(x) => x, + None => { + let data = format!("event: player-gone\n\ + data: player-gone\n\n") + .into_bytes().into_boxed_slice(); + assert_eq!(self.ending_send, None); + let ending = self.ending_send.get_or_insert(io::Cursor::new(data)); + return ending.read(orig_buf); + }, + }; + let pu = &mut iplayer.u; loop { @@ -230,12 +245,13 @@ pub fn content(iad : InstanceAccessDetails, gen: Generation) None => UpdateId::min_value(), Some((mut i,_)) => { i.try_increment(); i }, }; - + UpdateReader { need_flush : false, keepalives : Wrapping(0), overflow : None, gref, + ending_send : default(), init_confirmation_send : iter::once(()), wn : UpdateReaderWN { player, client, to_send,