From 377fa01e9866d403370ee2f39a4d6d33138fbb2b Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 20 Jun 2022 16:45:09 +0000 Subject: [PATCH] Report imex and configure success/failure after freeing ongoing Otherwise it's possible that library user (e.g. test) tries to start another ongoing process when previous one is not freed yet. --- CHANGELOG.md | 1 + src/configure.rs | 4 ++-- src/imex.rs | 36 +++++++++++++++--------------------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1ab1ebfb..b9ffb184f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - python: avoid exceptions when messages/contacts/chats are compared with `None` - node: wait for the event loop to stop before destroying contexts #3431 - emit configuration errors via event on failure #3433 +- report configure and imex success/failure after freeing ongoing process #3442 ### API-Changes - python: added `Message.get_status_updates()` #3416 diff --git a/src/configure.rs b/src/configure.rs index 80136af1a..ec3456ef8 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -75,6 +75,8 @@ impl Context { })) .await; + self.free_ongoing().await; + if let Err(err) = res.as_ref() { progress!( self, @@ -93,8 +95,6 @@ impl Context { progress!(self, 1000); } - self.free_ongoing().await; - res } diff --git a/src/imex.rs b/src/imex.rs index fd304f18c..f649f29ff 100644 --- a/src/imex.rs +++ b/src/imex.rs @@ -86,30 +86,24 @@ pub async fn imex( ) -> Result<()> { let cancel = context.alloc_ongoing().await?; - let res = async { - let success = imex_inner(context, what, path, passphrase).await; - match success { - Ok(()) => { - info!(context, "IMEX successfully completed"); - context.emit_event(EventType::ImexProgress(1000)); - Ok(()) - } - Err(err) => { - // We are using Anyhow's .context() and to show the inner error, too, we need the {:#}: - error!(context, "{:#}", err); - context.emit_event(EventType::ImexProgress(0)); - bail!("IMEX FAILED to complete: {}", err); - } - } - } - .race(async { - cancel.recv().await.ok(); - Err(format_err!("canceled")) - }) - .await; + let res = imex_inner(context, what, path, passphrase) + .race(async { + cancel.recv().await.ok(); + Err(format_err!("canceled")) + }) + .await; context.free_ongoing().await; + if let Err(err) = res.as_ref() { + // We are using Anyhow's .context() and to show the inner error, too, we need the {:#}: + error!(context, "IMEX failed to complete: {:#}", err); + context.emit_event(EventType::ImexProgress(0)); + } else { + info!(context, "IMEX successfully completed"); + context.emit_event(EventType::ImexProgress(1000)); + } + res }