diff options
author | Milan Crha <mcrha@redhat.com> | 2018-07-25 16:13:43 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2018-07-25 16:13:43 +0200 |
commit | 3c6be739560203a6dee79b8f13fcbeeaed07242a (patch) | |
tree | 7f9e770bbf9c693a9cf32316d143306b48e1ec38 | |
parent | ff1af187f8bd608c85549aaa877cd03bcc54d7be (diff) | |
download | evolution-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.c | 20 |
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)); |