[evolution-data-server] [Camel] Freeze/thaw also subfolders of vFolders
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] [Camel] Freeze/thaw also subfolders of vFolders
- Date: Tue, 12 May 2015 08:01:37 +0000 (UTC)
commit 55d40dfafa496ff494435cc604bd1d95c0d75d02
Author: Milan Crha <mcrha redhat com>
Date: Tue May 12 09:58:21 2015 +0200
[Camel] Freeze/thaw also subfolders of vFolders
The problem with not freezing/thawing subfolders of vFolders exhibited
in operations with multiple messages at once, like when deleting
junk messages in a virtual Junk folder, the subfolders notified about
each single message info change, causing performance issues.
camel/camel-vee-folder.c | 34 ++++++++++++++++++++++++++++++++++
1 files changed, 34 insertions(+), 0 deletions(-)
---
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index cb9c7a8..ff2e5ed 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -806,6 +806,7 @@ static void
vee_folder_freeze (CamelFolder *folder)
{
CamelVeeFolder *vfolder = CAMEL_VEE_FOLDER (folder);
+ GList *link;
if (vfolder->priv->parent_vee_store &&
!vee_folder_is_unmatched (vfolder)) {
@@ -816,6 +817,14 @@ vee_folder_freeze (CamelFolder *folder)
camel_folder_freeze (CAMEL_FOLDER (unmatched_folder));
}
+ g_rec_mutex_lock (&vfolder->priv->subfolder_lock);
+ for (link = vfolder->priv->subfolders; link; link = g_list_next (link)) {
+ CamelFolder *subfolder = link->data;
+
+ camel_folder_freeze (subfolder);
+ }
+ g_rec_mutex_unlock (&vfolder->priv->subfolder_lock);
+
/* call parent implementation */
CAMEL_FOLDER_CLASS (camel_vee_folder_parent_class)->freeze (folder);
}
@@ -824,6 +833,7 @@ static void
vee_folder_thaw (CamelFolder *folder)
{
CamelVeeFolder *vfolder = CAMEL_VEE_FOLDER (folder);
+ GList *link;
if (vfolder->priv->parent_vee_store &&
!vee_folder_is_unmatched (vfolder)) {
@@ -834,6 +844,14 @@ vee_folder_thaw (CamelFolder *folder)
camel_folder_thaw (CAMEL_FOLDER (unmatched_folder));
}
+ g_rec_mutex_lock (&vfolder->priv->subfolder_lock);
+ for (link = vfolder->priv->subfolders; link; link = g_list_next (link)) {
+ CamelFolder *subfolder = link->data;
+
+ camel_folder_thaw (subfolder);
+ }
+ g_rec_mutex_unlock (&vfolder->priv->subfolder_lock);
+
/* call parent implementation */
CAMEL_FOLDER_CLASS (camel_vee_folder_parent_class)->thaw (folder);
}
@@ -1333,7 +1351,15 @@ camel_vee_folder_add_folder (CamelVeeFolder *vfolder,
g_rec_mutex_lock (&vfolder->priv->subfolder_lock);
if (g_list_find (vfolder->priv->subfolders, subfolder) == NULL) {
+ gint freeze_count;
+
vfolder->priv->subfolders = g_list_append (vfolder->priv->subfolders, g_object_ref
(subfolder));
+
+ freeze_count = camel_folder_get_frozen_count (CAMEL_FOLDER (vfolder));
+ while (freeze_count > 0) {
+ camel_folder_freeze (subfolder);
+ freeze_count--;
+ }
} else {
/* nothing to do, it's already there */
g_rec_mutex_unlock (&vfolder->priv->subfolder_lock);
@@ -1365,6 +1391,8 @@ camel_vee_folder_remove_folder (CamelVeeFolder *vfolder,
CamelFolder *subfolder,
GCancellable *cancellable)
{
+ gint freeze_count;
+
g_return_if_fail (CAMEL_IS_VEE_FOLDER (vfolder));
g_rec_mutex_lock (&vfolder->priv->subfolder_lock);
@@ -1379,6 +1407,12 @@ camel_vee_folder_remove_folder (CamelVeeFolder *vfolder,
vfolder->priv->subfolders = g_list_remove (vfolder->priv->subfolders, subfolder);
+ freeze_count = camel_folder_get_frozen_count (CAMEL_FOLDER (vfolder));
+ while (freeze_count > 0) {
+ camel_folder_thaw (subfolder);
+ freeze_count--;
+ }
+
g_rec_mutex_unlock (&vfolder->priv->subfolder_lock);
CAMEL_VEE_FOLDER_GET_CLASS (vfolder)->remove_folder (vfolder, subfolder, cancellable);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]