diff --git a/src/components/mail/compose.rs b/src/components/mail/compose.rs index 63cfd211..1c0e2045 100644 --- a/src/components/mail/compose.rs +++ b/src/components/mail/compose.rs @@ -256,12 +256,12 @@ impl Composer { )); } Ok(fut) => { - let (mut rcvr, job_id) = context.accounts[coordinates.0] + let (mut rcvr, handle, job_id) = context.accounts[coordinates.0] .job_executor .spawn_specialized(fut); context.accounts[coordinates.0] .active_jobs - .insert(job_id, JobRequest::AsBytes); + .insert(job_id, JobRequest::AsBytes(handle)); if let Ok(Some(parent_bytes)) = try_recv_timeout!(&mut rcvr) { match parent_bytes { Err(err) => { diff --git a/src/components/mail/listing.rs b/src/components/mail/listing.rs index c9500ffd..68403469 100644 --- a/src/components/mail/listing.rs +++ b/src/components/mail/listing.rs @@ -176,10 +176,10 @@ pub trait MailListingTrait: ListingTrait { )); } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); + let (rcvr, handle, job_id) = account.job_executor.spawn_specialized(fut); account .active_jobs - .insert(job_id, JobRequest::SetFlags(env_hash, rcvr)); + .insert(job_id, JobRequest::SetFlags(env_hash, handle, rcvr)); } }, ListingAction::SetUnseen => match envelope.set_unseen(op) { @@ -189,10 +189,10 @@ pub trait MailListingTrait: ListingTrait { )); } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); + let (rcvr, handle, job_id) = account.job_executor.spawn_specialized(fut); account .active_jobs - .insert(job_id, JobRequest::SetFlags(env_hash, rcvr)); + .insert(job_id, JobRequest::SetFlags(env_hash, handle, rcvr)); } }, ListingAction::Delete => { @@ -207,10 +207,11 @@ pub trait MailListingTrait: ListingTrait { return; } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(fut); account .active_jobs - .insert(job_id, JobRequest::DeleteMessage(env_hash, rcvr)); + .insert(job_id, JobRequest::DeleteMessage(env_hash, handle, rcvr)); } } continue; @@ -230,10 +231,12 @@ pub trait MailListingTrait: ListingTrait { return; } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); - account - .active_jobs - .insert(job_id, JobRequest::SaveMessage(mailbox_hash, rcvr)); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(fut); + account.active_jobs.insert( + job_id, + JobRequest::SaveMessage(mailbox_hash, handle, rcvr), + ); } } continue; @@ -253,10 +256,11 @@ pub trait MailListingTrait: ListingTrait { })?; let account = &mut context.accounts[account_pos]; let mailbox_hash = account.mailbox_by_path(mailbox_path)?; - let (rcvr, job_id) = account.job_executor.spawn_specialized(bytes_fut); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(bytes_fut); account .active_jobs - .insert(job_id, JobRequest::CopyTo(mailbox_hash, rcvr)); + .insert(job_id, JobRequest::CopyTo(mailbox_hash, handle, rcvr)); Ok(()) }) { context.replies.push_back(UIEvent::Notification( @@ -283,10 +287,12 @@ pub trait MailListingTrait: ListingTrait { return; } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); - account - .active_jobs - .insert(job_id, JobRequest::SaveMessage(mailbox_hash, rcvr)); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(fut); + account.active_jobs.insert( + job_id, + JobRequest::SaveMessage(mailbox_hash, handle, rcvr), + ); } } continue; @@ -306,10 +312,11 @@ pub trait MailListingTrait: ListingTrait { })?; let account = &mut context.accounts[account_pos]; let mailbox_hash = account.mailbox_by_path(mailbox_path)?; - let (rcvr, job_id) = account.job_executor.spawn_specialized(bytes_fut); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(bytes_fut); account .active_jobs - .insert(job_id, JobRequest::CopyTo(mailbox_hash, rcvr)); + .insert(job_id, JobRequest::CopyTo(mailbox_hash, handle, rcvr)); Ok(()) }) { context.replies.push_back(UIEvent::Notification( @@ -339,10 +346,11 @@ pub trait MailListingTrait: ListingTrait { return; } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(fut); account .active_jobs - .insert(job_id, JobRequest::SetFlags(env_hash, rcvr)); + .insert(job_id, JobRequest::SetFlags(env_hash, handle, rcvr)); } } } @@ -357,10 +365,11 @@ pub trait MailListingTrait: ListingTrait { return; } Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); + let (rcvr, handle, job_id) = + account.job_executor.spawn_specialized(fut); account .active_jobs - .insert(job_id, JobRequest::SetFlags(env_hash, rcvr)); + .insert(job_id, JobRequest::SetFlags(env_hash, handle, rcvr)); } } } diff --git a/src/components/mail/listing/compact.rs b/src/components/mail/listing/compact.rs index f9883205..0194d774 100644 --- a/src/components/mail/listing/compact.rs +++ b/src/components/mail/listing/compact.rs @@ -1534,12 +1534,12 @@ impl Component for CompactListing { self.cursor_pos.1, ) { Ok(job) => { - let (chan, job_id) = context.accounts[self.cursor_pos.0] + let (chan, handle, job_id) = context.accounts[self.cursor_pos.0] .job_executor .spawn_specialized(job); context.accounts[self.cursor_pos.0] .active_jobs - .insert(job_id.clone(), crate::conf::accounts::JobRequest::Search); + .insert(job_id, crate::conf::accounts::JobRequest::Search(handle)); self.search_job = Some((filter_term.to_string(), chan, job_id)); } Err(err) => { diff --git a/src/components/mail/listing/conversations.rs b/src/components/mail/listing/conversations.rs index 7b48fff4..cb69bd10 100644 --- a/src/components/mail/listing/conversations.rs +++ b/src/components/mail/listing/conversations.rs @@ -1354,12 +1354,12 @@ impl Component for ConversationsListing { self.cursor_pos.1, ) { Ok(job) => { - let (chan, job_id) = context.accounts[self.cursor_pos.0] + let (chan, handle, job_id) = context.accounts[self.cursor_pos.0] .job_executor .spawn_specialized(job); context.accounts[self.cursor_pos.0] .active_jobs - .insert(job_id, crate::conf::accounts::JobRequest::Search); + .insert(job_id, crate::conf::accounts::JobRequest::Search(handle)); self.search_job = Some((filter_term.to_string(), chan, job_id)); } Err(err) => { diff --git a/src/components/mail/listing/plain.rs b/src/components/mail/listing/plain.rs index 539e6be0..20b324e4 100644 --- a/src/components/mail/listing/plain.rs +++ b/src/components/mail/listing/plain.rs @@ -22,7 +22,7 @@ use super::EntryStrings; use super::*; use crate::components::utilities::PageMovement; -use crate::jobs::{oneshot, JobId}; +use crate::jobs::{oneshot, JobId, JoinHandle}; use std::cmp; use std::iter::FromIterator; @@ -80,7 +80,7 @@ pub struct PlainListing { _row_updates: SmallVec<[ThreadHash; 8]>, color_cache: ColorCache, - active_jobs: HashMap>>, + active_jobs: HashMap>)>, movement: Option, id: ComponentId, } @@ -1031,8 +1031,8 @@ impl PlainListing { ))); } Ok(fut) => { - let (handle, job_id) = account.job_executor.spawn_specialized(fut); - self.active_jobs.insert(job_id, handle); + let (rcvr, handle, job_id) = account.job_executor.spawn_specialized(fut); + self.active_jobs.insert(job_id, (handle, rcvr)); } } self.row_updates.push(env_hash); @@ -1284,12 +1284,13 @@ impl Component for PlainListing { self.cursor_pos.1, ) { Ok(job) => { - let (chan, job_id) = context.accounts[self.cursor_pos.0] + let (chan, handle, job_id) = context.accounts[self.cursor_pos.0] .job_executor .spawn_specialized(job); - context.accounts[self.cursor_pos.0] - .active_jobs - .insert(job_id.clone(), crate::conf::accounts::JobRequest::Search); + context.accounts[self.cursor_pos.0].active_jobs.insert( + job_id, + crate::conf::accounts::JobRequest::Search(handle), + ); self.search_job = Some((filter_term.to_string(), chan, job_id)); } Err(err) => { diff --git a/src/components/mail/view.rs b/src/components/mail/view.rs index cfcfe39b..8f8e670d 100644 --- a/src/components/mail/view.rs +++ b/src/components/mail/view.rs @@ -193,13 +193,16 @@ impl MailView { .and_then(|mut op| op.as_bytes()) { Ok(fut) => { - let (mut chan, job_id) = account.job_executor.spawn_specialized(fut); + let (mut chan, handle, job_id) = + account.job_executor.spawn_specialized(fut); if let Ok(Some(bytes_result)) = try_recv_timeout!(&mut chan) { self.state = MailViewState::Loaded { body: bytes_result }; } else { self.state = MailViewState::LoadingBody { job_id, chan }; self.active_jobs.insert(job_id); - account.active_jobs.insert(job_id, JobRequest::AsBytes); + account + .active_jobs + .insert(job_id, JobRequest::AsBytes(handle)); context .replies .push_back(UIEvent::StatusEvent(StatusEvent::NewJob(job_id))); @@ -218,10 +221,11 @@ impl MailView { .and_then(|mut op| op.set_flag(Flag::SEEN, true)) { Ok(fut) => { - let (rcvr, job_id) = account.job_executor.spawn_specialized(fut); - account - .active_jobs - .insert(job_id, JobRequest::SetFlags(self.coordinates.2, rcvr)); + let (rcvr, handle, job_id) = account.job_executor.spawn_specialized(fut); + account.active_jobs.insert( + job_id, + JobRequest::SetFlags(self.coordinates.2, handle, rcvr), + ); } Err(e) => { context.replies.push_back(UIEvent::StatusEvent( diff --git a/src/conf/accounts.rs b/src/conf/accounts.rs index 7c9fad45..fd155a94 100644 --- a/src/conf/accounts.rs +++ b/src/conf/accounts.rs @@ -157,53 +157,65 @@ pub struct Account { } pub enum JobRequest { - Mailboxes(oneshot::Receiver>>), + Mailboxes( + JoinHandle, + oneshot::Receiver>>, + ), Get( MailboxHash, + JoinHandle, oneshot::Receiver<( Option>>, Pin>> + Send + 'static>>, )>, ), - IsOnline(oneshot::Receiver>), - Refresh(MailboxHash, oneshot::Receiver>), - SetFlags(EnvelopeHash, oneshot::Receiver>), - SaveMessage(MailboxHash, oneshot::Receiver>), - CopyTo(MailboxHash, oneshot::Receiver>>), - DeleteMessage(EnvelopeHash, oneshot::Receiver>), - CreateMailbox(oneshot::Receiver)>>), - DeleteMailbox(oneshot::Receiver>>), + IsOnline(JoinHandle, oneshot::Receiver>), + Refresh(MailboxHash, JoinHandle, oneshot::Receiver>), + SetFlags(EnvelopeHash, JoinHandle, oneshot::Receiver>), + SaveMessage(MailboxHash, JoinHandle, oneshot::Receiver>), + SendMessage(JoinHandle, oneshot::Receiver>), + CopyTo(MailboxHash, JoinHandle, oneshot::Receiver>>), + DeleteMessage(EnvelopeHash, JoinHandle, oneshot::Receiver>), + CreateMailbox( + JoinHandle, + oneshot::Receiver)>>, + ), + DeleteMailbox( + JoinHandle, + oneshot::Receiver>>, + ), //RenameMailbox, - Search, - AsBytes, - SetMailboxPermissions(MailboxHash, oneshot::Receiver>), - SetMailboxSubscription(MailboxHash, oneshot::Receiver>), + Search(JoinHandle), + AsBytes(JoinHandle), + SetMailboxPermissions(MailboxHash, JoinHandle, oneshot::Receiver>), + SetMailboxSubscription(MailboxHash, JoinHandle, oneshot::Receiver>), Watch(JoinHandle), } impl core::fmt::Debug for JobRequest { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { match self { - JobRequest::Mailboxes(_) => write!(f, "JobRequest::Mailboxes"), - JobRequest::Get(hash, _) => write!(f, "JobRequest::Get({})", hash), - JobRequest::IsOnline(_) => write!(f, "JobRequest::IsOnline"), - JobRequest::Refresh(_, _) => write!(f, "JobRequest::Refresh"), - JobRequest::SetFlags(_, _) => write!(f, "JobRequest::SetFlags"), - JobRequest::SaveMessage(_, _) => write!(f, "JobRequest::SaveMessage"), - JobRequest::CopyTo(_, _) => write!(f, "JobRequest::CopyTo"), - JobRequest::DeleteMessage(_, _) => write!(f, "JobRequest::DeleteMessage"), - JobRequest::CreateMailbox(_) => write!(f, "JobRequest::CreateMailbox"), - JobRequest::DeleteMailbox(_) => write!(f, "JobRequest::DeleteMailbox"), + JobRequest::Mailboxes(_, _) => write!(f, "JobRequest::Mailboxes"), + JobRequest::Get(hash, _, _) => write!(f, "JobRequest::Get({})", hash), + JobRequest::IsOnline(_, _) => write!(f, "JobRequest::IsOnline"), + JobRequest::Refresh(_, _, _) => write!(f, "JobRequest::Refresh"), + JobRequest::SetFlags(_, _, _) => write!(f, "JobRequest::SetFlags"), + JobRequest::SaveMessage(_, _, _) => write!(f, "JobRequest::SaveMessage"), + JobRequest::CopyTo(_, _, _) => write!(f, "JobRequest::CopyTo"), + JobRequest::DeleteMessage(_, _, _) => write!(f, "JobRequest::DeleteMessage"), + JobRequest::CreateMailbox(_, _) => write!(f, "JobRequest::CreateMailbox"), + JobRequest::DeleteMailbox(_, _) => write!(f, "JobRequest::DeleteMailbox"), //JobRequest::RenameMailbox, - JobRequest::Search => write!(f, "JobRequest::Search"), - JobRequest::AsBytes => write!(f, "JobRequest::AsBytes"), - JobRequest::SetMailboxPermissions(_, _) => { + JobRequest::Search(_) => write!(f, "JobRequest::Search"), + JobRequest::AsBytes(_) => write!(f, "JobRequest::AsBytes"), + JobRequest::SetMailboxPermissions(_, _, _) => { write!(f, "JobRequest::SetMailboxPermissions") } - JobRequest::SetMailboxSubscription(_, _) => { + JobRequest::SetMailboxSubscription(_, _, _) => { write!(f, "JobRequest::SetMailboxSubscription") } JobRequest::Watch(_) => write!(f, "JobRequest::Watch"), + JobRequest::SendMessage(_, _) => write!(f, "JobRequest::SendMessage"), } } } @@ -218,14 +230,14 @@ impl JobRequest { fn is_get(&self, mailbox_hash: MailboxHash) -> bool { match self { - JobRequest::Get(h, _) if *h == mailbox_hash => true, + JobRequest::Get(h, _, _) if *h == mailbox_hash => true, _ => false, } } fn is_online(&self) -> bool { match self { - JobRequest::IsOnline(_) => true, + JobRequest::IsOnline(_, _) => true, _ => false, } } @@ -338,9 +350,9 @@ impl Account { if backend.is_async() { if let Ok(mailboxes_job) = backend.mailboxes_async() { if let Ok(online_job) = backend.is_online_async() { - let (rcvr, job_id) = + let (rcvr, handle, job_id) = job_executor.spawn_specialized(online_job.then(|_| mailboxes_job)); - active_jobs.insert(job_id, JobRequest::Mailboxes(rcvr)); + active_jobs.insert(job_id, JobRequest::Mailboxes(handle, rcvr)); } } } @@ -511,13 +523,15 @@ impl Account { if self.is_async { if let Ok(mailbox_job) = self.backend.write().unwrap().get_async(&f) { let mailbox_job = mailbox_job.into_future(); - let (rcvr, job_id) = self.job_executor.spawn_specialized(mailbox_job); + let (rcvr, handle, job_id) = + self.job_executor.spawn_specialized(mailbox_job); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::NewJob(job_id), ))) .unwrap(); - self.active_jobs.insert(job_id, JobRequest::Get(*h, rcvr)); + self.active_jobs + .insert(job_id, JobRequest::Get(*h, handle, rcvr)); } } else { entry.worker = match Account::new_worker( @@ -872,14 +886,14 @@ impl Account { })); if self.is_async { if let Ok(refresh_job) = self.backend.write().unwrap().refresh_async(mailbox_hash, r) { - let (rcvr, job_id) = self.job_executor.spawn_specialized(refresh_job); + let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(refresh_job); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::NewJob(job_id), ))) .unwrap(); self.active_jobs - .insert(job_id, JobRequest::Refresh(mailbox_hash, rcvr)); + .insert(job_id, JobRequest::Refresh(mailbox_hash, handle, rcvr)); } } else { let mut h = self.backend.write().unwrap().refresh(mailbox_hash, r)?; @@ -994,7 +1008,7 @@ impl Account { ) { Ok(mailbox_job) => { let mailbox_job = mailbox_job.into_future(); - let (rcvr, job_id) = + let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(mailbox_job); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( @@ -1003,7 +1017,7 @@ impl Account { .unwrap(); self.active_jobs.insert( job_id, - JobRequest::Get(mailbox_hash, rcvr), + JobRequest::Get(mailbox_hash, handle, rcvr), ); } Err(err) => { @@ -1196,14 +1210,14 @@ impl Account { .write() .unwrap() .save(bytes.to_vec(), mailbox_hash, flags)?; - let (rcvr, job_id) = self.job_executor.spawn_specialized(job); + let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(job); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::NewJob(job_id), ))) .unwrap(); self.active_jobs - .insert(job_id, JobRequest::SaveMessage(mailbox_hash, rcvr)); + .insert(job_id, JobRequest::SaveMessage(mailbox_hash, handle, rcvr)); Ok(()) } @@ -1419,8 +1433,9 @@ impl Account { } if !self.active_jobs.values().any(JobRequest::is_online) { if let Ok(online_job) = self.backend.read().unwrap().is_online_async() { - let (rcvr, job_id) = self.job_executor.spawn_specialized(online_job); - self.active_jobs.insert(job_id, JobRequest::IsOnline(rcvr)); + let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(online_job); + self.active_jobs + .insert(job_id, JobRequest::IsOnline(handle, rcvr)); } } return self.is_online.clone(); @@ -1506,20 +1521,21 @@ impl Account { pub fn process_event(&mut self, job_id: &JobId) -> bool { if self.active_jobs.contains_key(job_id) { match self.active_jobs.remove(job_id).unwrap() { - JobRequest::Mailboxes(mut chan) => { + JobRequest::Mailboxes(_, mut chan) => { if let Some(mailboxes) = chan.try_recv().unwrap() { if mailboxes.is_err() || self.init(Some(mailboxes.unwrap())).is_err() { if let Ok(mailboxes_job) = self.backend.read().unwrap().mailboxes_async() { - let (rcvr, job_id) = + let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(mailboxes_job); - self.active_jobs.insert(job_id, JobRequest::Mailboxes(rcvr)); + self.active_jobs + .insert(job_id, JobRequest::Mailboxes(handle, rcvr)); } } } } - JobRequest::Get(mailbox_hash, mut chan) => { + JobRequest::Get(mailbox_hash, _, mut chan) => { self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::JobFinished(*job_id), @@ -1545,14 +1561,15 @@ impl Account { .unwrap(); return true; } - let (rcvr, job_id) = self.job_executor.spawn_specialized(rest.into_future()); + let (rcvr, handle, job_id) = + self.job_executor.spawn_specialized(rest.into_future()); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::NewJob(job_id), ))) .unwrap(); self.active_jobs - .insert(job_id, JobRequest::Get(mailbox_hash, rcvr)); + .insert(job_id, JobRequest::Get(mailbox_hash, handle, rcvr)); let payload = payload.unwrap(); if let Err(err) = payload { self.mailbox_entries @@ -1592,7 +1609,7 @@ impl Account { )))) .unwrap(); } - JobRequest::IsOnline(mut chan) => { + JobRequest::IsOnline(_, mut chan) => { let is_online = chan.try_recv().unwrap(); if let Some(is_online) = is_online { self.sender @@ -1610,11 +1627,13 @@ impl Account { self.is_online = is_online; } if let Ok(online_job) = self.backend.read().unwrap().is_online_async() { - let (rcvr, job_id) = self.job_executor.spawn_specialized(online_job); - self.active_jobs.insert(job_id, JobRequest::IsOnline(rcvr)); + let (rcvr, handle, job_id) = + self.job_executor.spawn_specialized(online_job); + self.active_jobs + .insert(job_id, JobRequest::IsOnline(handle, rcvr)); } } - JobRequest::Refresh(_mailbox_hash, mut chan) => { + JobRequest::Refresh(_mailbox_hash, _, mut chan) => { let r = chan.try_recv().unwrap(); if let Some(r) = r { if r.is_ok() { @@ -1635,7 +1654,7 @@ impl Account { ))) .unwrap(); } - JobRequest::SetFlags(_, mut chan) => { + JobRequest::SetFlags(_, _, mut chan) => { let r = chan.try_recv().unwrap(); if let Some(Err(err)) = r { self.sender @@ -1647,7 +1666,7 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::SaveMessage(_, mut chan) => { + JobRequest::SaveMessage(_, _, mut chan) => { let r = chan.try_recv().unwrap(); if let Some(Err(err)) = r { self.sender @@ -1659,7 +1678,7 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::CopyTo(mailbox_hash, mut chan) => { + JobRequest::CopyTo(mailbox_hash, _, mut chan) => { if let Err(err) = chan .try_recv() .unwrap() @@ -1675,7 +1694,7 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::DeleteMessage(_, mut chan) => { + JobRequest::DeleteMessage(_, _, mut chan) => { let r = chan.try_recv().unwrap(); if let Some(Err(err)) = r { self.sender @@ -1687,7 +1706,7 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::CreateMailbox(mut chan) => { + JobRequest::CreateMailbox(_, mut chan) => { let r = chan.try_recv().unwrap(); if let Some(r) = r { self.sender @@ -1706,7 +1725,7 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::DeleteMailbox(mut chan) => { + JobRequest::DeleteMailbox(_, mut chan) => { let r = chan.try_recv().unwrap(); match r { Some(Err(err)) => { @@ -1731,14 +1750,14 @@ impl Account { } } //JobRequest::RenameMailbox, - JobRequest::Search | JobRequest::AsBytes => { + JobRequest::Search(_) | JobRequest::AsBytes(_) => { self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::JobFinished(*job_id), ))) .unwrap(); } - JobRequest::SetMailboxPermissions(_, mut chan) => { + JobRequest::SetMailboxPermissions(_, _, mut chan) => { let r = chan.try_recv().unwrap(); match r { Some(Err(err)) => { @@ -1768,7 +1787,7 @@ impl Account { None => {} } } - JobRequest::SetMailboxSubscription(_, mut chan) => { + JobRequest::SetMailboxSubscription(_, _, mut chan) => { let r = chan.try_recv().unwrap(); match r { Some(Err(err)) => { diff --git a/src/jobs.rs b/src/jobs.rs index a0d65fb6..82e72591 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -183,7 +183,7 @@ impl JobExecutor { } ///// Spawns a future on the executor. - pub fn spawn_specialized(&self, future: F) -> (oneshot::Receiver, JobId) + pub fn spawn_specialized(&self, future: F) -> (oneshot::Receiver, JoinHandle, JobId) where F: Future + Send + 'static, R: Send + 'static, @@ -195,13 +195,14 @@ impl JobExecutor { let __job_id = job_id; let injector = self.global_queue.clone(); // Create a task and schedule it for execution. - let (task, _) = async_task::spawn( + let (task, handle) = async_task::spawn( async move { let res = future.await; let _ = sender.send(res); finished_sender .send(ThreadEvent::JobFinished(__job_id)) .unwrap(); + Ok(()) }, move |task| injector.push(MeliTask { task, id: _job_id }), (), @@ -211,7 +212,7 @@ impl JobExecutor { unparker.unpark(); } - (receiver, job_id) + (receiver, JoinHandle(handle), job_id) } }