diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index a87e839ea..23d92ea63 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -509,7 +509,7 @@ pub unsafe extern "C" fn dc_interrupt_imap_idle(context: *mut dc_context_t) { } let ffi_context = &*context; ffi_context - .with_inner(|ctx| job::interrupt_inbox_idle(ctx, true)) + .with_inner(|ctx| job::interrupt_inbox_idle(ctx)) .unwrap_or(()) } diff --git a/src/chat.rs b/src/chat.rs index f9bb79ef9..fb71333ba 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1352,7 +1352,7 @@ pub fn delete(context: &Context, chat_id: u32) -> Result<(), Error> { }); job_kill_action(context, Action::Housekeeping); - job_add(context, Action::Housekeeping, 0, Params::new(), 10); + add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10); Ok(()) } diff --git a/src/config.rs b/src/config.rs index fc760eef7..e277b5aaf 100644 --- a/src/config.rs +++ b/src/config.rs @@ -143,7 +143,7 @@ impl Context { } Config::InboxWatch => { let ret = self.sql.set_raw_config(self, key, value); - interrupt_inbox_idle(self, true); + interrupt_inbox_idle(self); ret } Config::SentboxWatch => { diff --git a/src/configure/mod.rs b/src/configure/mod.rs index dc0372bf4..babcff045 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -38,7 +38,7 @@ pub fn configure(context: &Context) { return; } job_kill_action(context, Action::ConfigureImap); - job_add(context, Action::ConfigureImap, 0, Params::new(), 0); + add_job_with_interrupt(context, Action::ConfigureImap, 0, Params::new(), 0); } /// Check if the context is already configured. diff --git a/src/context.rs b/src/context.rs index 9b49fa349..5a3d09e86 100644 --- a/src/context.rs +++ b/src/context.rs @@ -14,13 +14,11 @@ use crate::contact::*; use crate::error::*; use crate::events::Event; use crate::imap::*; -use crate::job::*; use crate::job_thread::JobThread; use crate::key::*; use crate::login_param::LoginParam; use crate::lot::Lot; -use crate::message::{self, Message, MsgId}; -use crate::param::Params; +use crate::message::{self, MsgId}; use crate::smtp::Smtp; use crate::sql::Sql; @@ -436,34 +434,6 @@ impl Context { false } } - - pub fn do_heuristics_moves(&self, folder: &str, msg_id: MsgId) { - if !self.get_config_bool(Config::MvboxMove) { - return; - } - - if self.is_mvbox(folder) { - return; - } - if let Ok(msg) = Message::load_from_db(self, msg_id) { - if msg.is_setupmessage() { - // do not move setup messages; - // there may be a non-delta device that wants to handle it - return; - } - - // 1 = dc message, 2 = reply to dc message - if 0 != msg.is_dc_message { - job_add( - self, - Action::MoveMsg, - msg.id.to_u32() as i32, - Params::new(), - 0, - ); - } - } - } } impl Drop for Context { diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index dbcdfb4d0..bf9464729 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -250,7 +250,7 @@ pub fn dc_receive_imf( // if we delete we don't need to try moving messages if needs_delete_job && !created_db_entries.is_empty() { - job_add( + add_job_no_interrupt( context, Action::DeleteMsgOnImap, created_db_entries[0].1.to_u32() as i32, @@ -258,7 +258,7 @@ pub fn dc_receive_imf( 0, ); } else { - context.do_heuristics_moves(server_folder.as_ref(), insert_msg_id); + crate::imap::do_heuristics_moves(context, server_folder.as_ref(), insert_msg_id); } info!( diff --git a/src/imap/mod.rs b/src/imap/mod.rs index 497dd781c..7079fd462 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -17,9 +17,9 @@ use crate::context::Context; use crate::dc_receive_imf::dc_receive_imf; use crate::events::Event; use crate::imap_client::*; -use crate::job::{job_add, Action}; +use crate::job::{add_job_no_interrupt, Action}; use crate::login_param::{CertificateChecks, LoginParam}; -use crate::message::{self, update_server_uid}; +use crate::message::{self, update_server_uid, Message, MsgId}; use crate::oauth2::dc_get_oauth2_access_token; use crate::param::Params; use crate::stock::StockMessage; @@ -1202,8 +1202,8 @@ fn precheck_imf(context: &Context, rfc724_mid: &str, server_folder: &str, server { if old_server_folder.is_empty() && old_server_uid == 0 { info!(context, "[move] detected bbc-self {}", rfc724_mid,); - context.do_heuristics_moves(server_folder.as_ref(), msg_id); - job_add( + do_heuristics_moves(context, server_folder.as_ref(), msg_id); + add_job_no_interrupt( context, Action::MarkseenMsgOnImap, msg_id.to_u32() as i32, @@ -1237,3 +1237,32 @@ fn prefetch_get_message_id(prefetch_msg: &Fetch) -> Result { wrapmime::parse_message_id(&message_id.unwrap()).map_err(Into::into) } + +pub fn do_heuristics_moves(context: &Context, folder: &str, msg_id: MsgId) { + if !context.get_config_bool(crate::config::Config::MvboxMove) { + return; + } + + if context.is_mvbox(folder) { + return; + } + if let Ok(msg) = Message::load_from_db(context, msg_id) { + if msg.is_setupmessage() { + // do not move setup messages; + // there may be a non-delta device that wants to handle it + return; + } + + // 1 = dc message, 2 = reply to dc message + if 0 != msg.is_dc_message { + // we are called from receive_imf so there is no idle running + add_job_no_interrupt( + context, + Action::MoveMsg, + msg.id.to_u32() as i32, + Params::new(), + 0, + ); + } + } +} diff --git a/src/imex.rs b/src/imex.rs index 0d5786e5f..f129a56bd 100644 --- a/src/imex.rs +++ b/src/imex.rs @@ -74,7 +74,7 @@ pub fn imex(context: &Context, what: ImexMode, param1: Option>) } job_kill_action(context, Action::ImexImap); - job_add(context, Action::ImexImap, 0, param, 0); + add_job_with_interrupt(context, Action::ImexImap, 0, param, 0); } /// Returns the filename of the backup found (otherwise an error) diff --git a/src/job.rs b/src/job.rs index 5f651e0a3..7df6c1283 100644 --- a/src/job.rs +++ b/src/job.rs @@ -134,7 +134,7 @@ impl Job { /// Updates the job already stored in the database. /// - /// To add a new job, use [job_add]. + /// To add a new job, use [add_job_*]. fn update(&self, context: &Context) -> bool { sql::execute( context, @@ -472,21 +472,10 @@ pub fn perform_sentbox_idle(context: &Context) { .idle(context, use_network); } -pub fn interrupt_inbox_idle(context: &Context, block: bool) { - info!(context, "interrupt_inbox_idle called blocking={}", block); - if block { - context.inbox_thread.read().unwrap().interrupt_idle(context); - } else { - match context.inbox_thread.try_read() { - Ok(inbox_thread) => { - inbox_thread.interrupt_idle(context); - } - Err(err) => { - *context.perform_inbox_jobs_needed.write().unwrap() = true; - warn!(context, "could not interrupt idle: {}", err); - } - } - } +pub fn interrupt_inbox_idle(context: &Context) { + info!(context, "interrupt_inbox_idle begin"); + context.inbox_thread.read().unwrap().interrupt_idle(context); + info!(context, "interrupt_inbox_idle finish"); } pub fn interrupt_mvbox_idle(context: &Context) { @@ -596,7 +585,7 @@ pub fn maybe_network(context: &Context) { } interrupt_smtp_idle(context); - interrupt_inbox_idle(context, true); + interrupt_inbox_idle(context); interrupt_mvbox_idle(context); interrupt_sentbox_idle(context); } @@ -918,7 +907,7 @@ fn add_smtp_job( param.set(Param::File, blob.as_name()); param.set(Param::Recipients, &recipients); - job_add( + add_job_with_interrupt( context, action, rendered_msg @@ -934,7 +923,7 @@ fn add_smtp_job( /// Adds a job to the database, scheduling it `delay_seconds` /// after the current time. -pub fn job_add( +pub fn add_job_no_interrupt( context: &Context, action: Action, foreign_id: i32, @@ -942,7 +931,7 @@ pub fn job_add( delay_seconds: i64, ) { if action == Action::Unknown { - error!(context, "Invalid action passed to job_add"); + error!(context, "Invalid action passed to add_job_no_interrupt"); return; } @@ -963,8 +952,23 @@ pub fn job_add( ] ).ok(); + if thread == Thread::Imap { + *context.perform_inbox_jobs_needed.write().unwrap() = true; + } +} + +pub fn add_job_with_interrupt( + context: &Context, + action: Action, + foreign_id: i32, + param: Params, + delay_seconds: i64, +) { + let thread: Thread = action.into(); + add_job_no_interrupt(context, action, foreign_id, param, delay_seconds); + match thread { - Thread::Imap => interrupt_inbox_idle(context, false), + Thread::Imap => interrupt_inbox_idle(context), Thread::Smtp => interrupt_smtp_idle(context), Thread::Unknown => {} } diff --git a/src/location.rs b/src/location.rs index 35bee16da..f3ade2f46 100644 --- a/src/location.rs +++ b/src/location.rs @@ -226,7 +226,7 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) { context.call_cb(Event::ChatModified(chat_id)); if 0 != seconds { schedule_MAYBE_SEND_LOCATIONS(context, false); - job_add( + add_job_with_interrupt( context, Action::MaybeSendLocationsEnded, chat_id as i32, @@ -241,7 +241,8 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) { #[allow(non_snake_case)] fn schedule_MAYBE_SEND_LOCATIONS(context: &Context, force_schedule: bool) { if force_schedule || !job_action_exists(context, Action::MaybeSendLocations) { - job_add(context, Action::MaybeSendLocations, 0, Params::new(), 60); + // XXX questionable to interrupt but set a +60secs target + add_job_with_interrupt(context, Action::MaybeSendLocations, 0, Params::new(), 60); }; } diff --git a/src/message.rs b/src/message.rs index 6a99c7029..37c62dcbd 100644 --- a/src/message.rs +++ b/src/message.rs @@ -875,7 +875,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) { } } update_msg_chat_id(context, *msg_id, DC_CHAT_ID_TRASH); - job_add( + add_job_with_interrupt( context, Action::DeleteMsgOnImap, msg_id.to_u32() as i32, @@ -890,7 +890,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) { msg_id: MsgId::new(0), }); job_kill_action(context, Action::Housekeeping); - job_add(context, Action::Housekeeping, 0, Params::new(), 10); + add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10); }; } @@ -961,7 +961,7 @@ pub fn markseen_msgs(context: &Context, msg_ids: &[MsgId]) -> bool { update_msg_state(context, *id, MessageState::InSeen); info!(context, "Seen message {}.", id); - job_add( + add_job_with_interrupt( context, Action::MarkseenMsgOnImap, id.to_u32() as i32, @@ -1319,7 +1319,7 @@ pub fn update_server_uid( #[allow(dead_code)] pub fn dc_empty_server(context: &Context, flags: u32) { job_kill_action(context, Action::EmptyServer); - job_add(context, Action::EmptyServer, flags as i32, Params::new(), 0); + add_job_with_interrupt(context, Action::EmptyServer, flags as i32, Params::new(), 0); } #[cfg(test)] diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 1028a11ec..69a91cfb4 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -15,7 +15,7 @@ use crate::dc_tools::*; use crate::e2ee; use crate::error::Result; use crate::headerdef::HeaderDef; -use crate::job::{job_add, Action}; +use crate::job::{add_job_no_interrupt, Action}; use crate::location; use crate::message; use crate::message::MsgId; @@ -782,7 +782,7 @@ impl<'a> MimeParser<'a> { if self.has_chat_version() && self.context.get_config_bool(Config::MvboxMove) { param.set_int(Param::AlsoMove, 1); } - job_add(self.context, Action::MarkseenMdnOnImap, 0, param, 0); + add_job_no_interrupt(self.context, Action::MarkseenMdnOnImap, 0, param, 0); } } }