From: Ian Jackson Date: Wed, 31 Mar 2021 17:08:42 +0000 (+0100) Subject: cmd updates: Refactor to make it clearer we don't drop uh X-Git-Tag: otter-0.5.0~350 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9f7423e4251b6bd22cad953e36337b73d4f148bd;p=otter.git cmd updates: Refactor to make it clearer we don't drop uh No actual functional change. I suspected a bug here but this wasn't it. Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index be44bc6a..371f9e80 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -845,9 +845,9 @@ fn execute_for_game<'cs, 'igr, 'ig: 'igr>( let (ok, uu) = ToRecalculate::with(|mut to_permute| { let r = (||{ - let mut uh = UpdateHandler::from_how(how); let mut responses = Vec::with_capacity(insns.len()); - let mut auth = None; + let mut uh_auth = None; + let mk_uh = || UpdateHandler::from_how(how); let who = if_chain! { let account = &cs.current_account()?.notional_account; let ig = igu.by_ref(Authorisation::authorise_any()); @@ -868,22 +868,30 @@ fn execute_for_game<'cs, 'igr, 'ig: 'igr>( let (updates, resp, unprepared, ig) = execute_game_insn(cs, ag, igu, insn, &who, &mut to_permute)?; + let (uh, _auth) = uh_auth.get_or_insert_with(||{ + let auth_y = Authorisation::authorised(&*ig.name); + let uh = mk_uh(); + (uh, auth_y) + }); uh.accumulate(ig, updates)?; responses.push(resp); - let auth_y = Authorisation::authorised(&*ig.name); - auth = Some(auth_y); if let Some(unprepared) = unprepared { + let uh = mem::replace(uh, mk_uh()); uh.complete(ig, &who)?; let mut prepub = PrepareUpdatesBuffer::new(ig, None, None); unprepared(&mut prepub); prepub.finish(); - uh = UpdateHandler::from_how(how); } } - if let Some(auth) = auth { uh.complete(igu.by_mut(auth), &who)?; } + if let Some((ref mut uh, auth)) = uh_auth { + mem::replace(uh, mk_uh()) + .complete(igu.by_mut(auth), &who)?; + } Ok(None) })(); - if let Some(auth) = auth { + if let Some((uh, auth)) = uh_auth { + let ig = igu.by_mut(auth); + uh.complete(ig, &who)?; igu.by_mut(auth).save_game_now()?; } Ok::<_,ME>(MgmtResponse::AlterGame {