summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2016-10-06 19:35:58 +0200
committerMilan Crha <mcrha@redhat.com>2016-10-06 19:35:58 +0200
commit523a82d44cb16f9b9283923d0b9324156826ece0 (patch)
tree7de899034eb831b00715208cb49fce871d236e4d
parent1231c17a43e85a754f117bf7eb458c8dc2ee2356 (diff)
downloadevolution-data-server-523a82d44cb16f9b9283923d0b9324156826ece0.tar.gz
Fix console runtime warnings from vFolder/vStore code on application quit
It could happen that search folders of search folders emitted runtime warnings on console on the application quit, which was caused by missing checks for such situation.
-rw-r--r--camel/camel-vee-folder.c32
-rw-r--r--camel/camel-vee-store.c17
2 files changed, 44 insertions, 5 deletions
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index 1c9fcc917..5566caa6d 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -269,6 +269,10 @@ vee_folder_merge_matching (CamelVeeFolder *vfolder,
g_return_if_fail (vsummary != NULL);
data_cache = vee_folder_get_data_cache (vfolder);
+ /* It can be NULL on dispose of the CamelVeeStore */
+ if (!data_cache)
+ return;
+
for (ii = 0; ii < match->len; ii++) {
const gchar *uid = match->pdata[ii];
@@ -385,8 +389,12 @@ vee_folder_subfolder_changed (CamelVeeFolder *vfolder,
}
g_rec_mutex_unlock (&vfolder->priv->subfolder_lock);
- changes = camel_folder_change_info_new ();
data_cache = vee_folder_get_data_cache (vfolder);
+ /* It can be NULL on dispose of the CamelVeeStore */
+ if (!data_cache)
+ return;
+
+ changes = camel_folder_change_info_new ();
v_folder = CAMEL_FOLDER (vfolder);
vsummary = CAMEL_VEE_SUMMARY (v_folder->summary);
@@ -663,8 +671,15 @@ vee_folder_propagate_skipped_changes (CamelVeeFolder *vf)
CamelFolder *v_folder;
CamelVeeDataCache *data_cache;
- changes = camel_folder_change_info_new ();
data_cache = vee_folder_get_data_cache (vf);
+
+ /* It can be NULL on dispose of the CamelVeeStore */
+ if (!data_cache) {
+ g_rec_mutex_unlock (&vf->priv->changed_lock);
+ return;
+ }
+
+ changes = camel_folder_change_info_new ();
v_folder = CAMEL_FOLDER (vf);
vsummary = CAMEL_VEE_SUMMARY (v_folder->summary);
@@ -1079,6 +1094,14 @@ vee_folder_remove_folder (CamelVeeFolder *vfolder,
rud.changes = changes;
rud.is_orig_message_uid = FALSE;
+ /* It can be NULL on dispose of the CamelVeeStore */
+ if (!rud.data_cache) {
+ camel_folder_thaw (v_folder);
+ camel_folder_change_info_free (changes);
+ g_hash_table_destroy (uids);
+ return;
+ }
+
g_hash_table_foreach (uids, vee_folder_remove_unmatched_cb, &rud);
if (vee_folder_is_unmatched (vfolder) &&
@@ -1609,7 +1632,10 @@ camel_vee_folder_remove_vuid (CamelVeeFolder *vfolder,
vsummary = CAMEL_VEE_SUMMARY (CAMEL_FOLDER (vfolder)->summary);
data_cache = vee_folder_get_data_cache (vfolder);
- vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, data_cache, mi_data, changes);
+
+ /* It can be NULL on dispose of the CamelVeeStore */
+ if (data_cache)
+ vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, data_cache, mi_data, changes);
}
/**
diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c
index 97511cc92..93697ba97 100644
--- a/camel/camel-vee-store.c
+++ b/camel/camel-vee-store.c
@@ -149,14 +149,26 @@ vee_store_get_property (GObject *object,
}
static void
+vee_store_dispose (GObject *object)
+{
+ CamelVeeStorePrivate *priv;
+
+ priv = CAMEL_VEE_STORE_GET_PRIVATE (object);
+
+ g_clear_object (&priv->vee_data_cache);
+ g_clear_object (&priv->unmatched_folder);
+
+ /* Chain up to parent's method. */
+ G_OBJECT_CLASS (camel_vee_store_parent_class)->dispose (object);
+}
+
+static void
vee_store_finalize (GObject *object)
{
CamelVeeStorePrivate *priv;
priv = CAMEL_VEE_STORE_GET_PRIVATE (object);
- g_object_unref (priv->unmatched_folder);
- g_object_unref (priv->vee_data_cache);
g_hash_table_destroy (priv->subfolder_usage_counts);
g_hash_table_destroy (priv->vuid_usage_counts);
g_mutex_clear (&priv->sf_counts_mutex);
@@ -510,6 +522,7 @@ camel_vee_store_class_init (CamelVeeStoreClass *class)
object_class = G_OBJECT_CLASS (class);
object_class->set_property = vee_store_set_property;
object_class->get_property = vee_store_get_property;
+ object_class->dispose = vee_store_dispose;
object_class->finalize = vee_store_finalize;
object_class->constructed = vee_store_constructed;