summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-07-25 16:13:43 +0200
committerMilan Crha <mcrha@redhat.com>2018-07-25 16:13:43 +0200
commit3c6be739560203a6dee79b8f13fcbeeaed07242a (patch)
tree7f9e770bbf9c693a9cf32316d143306b48e1ec38
parentff1af187f8bd608c85549aaa877cd03bcc54d7be (diff)
downloadevolution-data-server-3c6be739560203a6dee79b8f13fcbeeaed07242a.tar.gz
[CamelOfflineFolder] Fix a runtime warning on application exit
Due to folder's parent store being already freed and a folder's "changed" signal being delivered within ESourceRegistry dispose, which flushes its main context, where the "changed" signal is scheduled and delayed.
-rw-r--r--src/camel/camel-offline-folder.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/camel/camel-offline-folder.c b/src/camel/camel-offline-folder.c
index b4935157b..dd6587c20 100644
--- a/src/camel/camel-offline-folder.c
+++ b/src/camel/camel-offline-folder.c
@@ -208,10 +208,12 @@ offline_folder_schedule_store_changes_job (gpointer user_data)
g_mutex_lock (&offline_folder->priv->store_changes_lock);
if (offline_folder->priv->store_changes_id == g_source_get_id (source)) {
CamelSession *session;
+ CamelStore *parent_store;
offline_folder->priv->store_changes_id = 0;
- session = camel_service_ref_session (CAMEL_SERVICE (camel_folder_get_parent_store (CAMEL_FOLDER (offline_folder))));
+ parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (offline_folder));
+ session = parent_store ? camel_service_ref_session (CAMEL_SERVICE (parent_store)) : NULL;
if (session) {
gchar *description;
@@ -219,7 +221,7 @@ offline_folder_schedule_store_changes_job (gpointer user_data)
is replaced with a full path name. The spaces around “:” are intentional, as
the whole “%s : %s” is meant as an absolute identification of the folder. */
description = g_strdup_printf (_("Storing changes in folder “%s : %s”"),
- camel_service_get_display_name (CAMEL_SERVICE (camel_folder_get_parent_store (CAMEL_FOLDER (offline_folder)))),
+ camel_service_get_display_name (CAMEL_SERVICE (parent_store)),
camel_folder_get_full_name (CAMEL_FOLDER (offline_folder)));
camel_session_submit_job (session, description,
@@ -259,7 +261,7 @@ offline_folder_maybe_schedule_folder_change_store (CamelOfflineFolder *offline_f
}
store = camel_folder_get_parent_store (CAMEL_FOLDER (offline_folder));
- session = camel_service_ref_session (CAMEL_SERVICE (store));
+ session = store ? camel_service_ref_session (CAMEL_SERVICE (store)) : NULL;
if (session && camel_session_get_online (session) && CAMEL_IS_OFFLINE_STORE (store) &&
camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) {
@@ -291,6 +293,9 @@ offline_folder_changed (CamelFolder *folder,
CamelSession *session;
store = camel_folder_get_parent_store (folder);
+ if (!store)
+ return;
+
session = camel_service_ref_session (CAMEL_SERVICE (store));
if (!session)
@@ -309,7 +314,7 @@ offline_folder_changed (CamelFolder *folder,
is replaced with a full path name. The spaces around “:” are intentional, as
the whole “%s : %s” is meant as an absolute identification of the folder. */
description = g_strdup_printf (_("Checking download of new messages for offline in “%s : %s”"),
- camel_service_get_display_name (CAMEL_SERVICE (camel_folder_get_parent_store (folder))),
+ camel_service_get_display_name (CAMEL_SERVICE (store)),
camel_folder_get_full_name (folder));
camel_session_submit_job (
@@ -659,12 +664,17 @@ camel_offline_folder_can_downsync (CamelOfflineFolder *folder)
{
CamelService *service;
CamelSettings *settings;
+ CamelStore *parent_store;
CamelThreeState sync_folder;
gboolean sync_store;
g_return_val_if_fail (CAMEL_IS_OFFLINE_FOLDER (folder), FALSE);
- service = CAMEL_SERVICE (camel_folder_get_parent_store (CAMEL_FOLDER (folder)));
+ parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (folder));
+ if (!parent_store)
+ return FALSE;
+
+ service = CAMEL_SERVICE (parent_store);
settings = camel_service_ref_settings (service);
sync_store = camel_offline_settings_get_stay_synchronized (CAMEL_OFFLINE_SETTINGS (settings));