From 28f45805d7982a5be6d0ced893d88620e6548663 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Tue, 13 Aug 2024 13:04:17 +0300 Subject: [PATCH] mail/view: try cancel env fetch on Drop Signed-off-by: Manos Pitsidianakis --- meli/src/mail/view.rs | 10 +++++----- meli/src/mail/view/state.rs | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/meli/src/mail/view.rs b/meli/src/mail/view.rs index 8153edd9..3cfd67c2 100644 --- a/meli/src/mail/view.rs +++ b/meli/src/mail/view.rs @@ -130,7 +130,7 @@ impl MailView { { Ok(fut) => { let mut handle = account.main_loop_handler.job_executor.spawn( - "fetch-envelopes".into(), + "fetch-envelope".into(), fut, account.is_async(), ); @@ -154,6 +154,7 @@ impl MailView { } } else { self.state = MailViewState::LoadingBody { + main_loop_handler: self.main_loop_handler.clone(), handle, pending_action: pending_action.take(), }; @@ -437,10 +438,9 @@ impl Component for MailView { if self.active_jobs.contains(job_id) => { match self.state { - MailViewState::LoadingBody { - ref mut handle, - pending_action: _, - } if handle.job_id == *job_id => { + MailViewState::LoadingBody { ref mut handle, .. } + if handle.job_id == *job_id => + { match handle.chan.try_recv() { Err(_) => { /* Job was canceled */ } Ok(None) => { /* something happened, perhaps a worker diff --git a/meli/src/mail/view/state.rs b/meli/src/mail/view/state.rs index 91f6f5ae..b2fc8664 100644 --- a/meli/src/mail/view/state.rs +++ b/meli/src/mail/view/state.rs @@ -22,7 +22,9 @@ use melib::{text::Truncate, Envelope, Error, Mail, Result}; use super::{EnvelopeView, MailView, ViewSettings}; -use crate::{jobs::JoinHandle, mailbox_settings, Component, Context, ShortcutMaps, UIEvent}; +use crate::{ + jobs::JoinHandle, mailbox_settings, Component, Context, ShortcutMaps, ThreadEvent, UIEvent, +}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum PendingReplyAction { @@ -39,6 +41,7 @@ pub enum MailViewState { pending_action: Option, }, LoadingBody { + main_loop_handler: crate::MainLoopHandler, handle: JoinHandle>>, pending_action: Option, }, @@ -53,6 +56,23 @@ pub enum MailViewState { }, } +impl Drop for MailViewState { + fn drop(&mut self) { + let Self::LoadingBody { + handle, + main_loop_handler, + .. + } = self + else { + return; + }; + let Some(ev) = handle.cancel() else { + return; + }; + main_loop_handler.send(ThreadEvent::UIEvent(UIEvent::StatusEvent(ev))); + } +} + impl std::fmt::Display for MailViewState { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { match self {