summaryrefslogtreecommitdiff
path: root/src/libebackend
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-02-16 15:03:50 +0100
committerMilan Crha <mcrha@redhat.com>2018-02-16 15:03:50 +0100
commit59c43baa15eaedacd1ead99757d50fc9537025c7 (patch)
tree2df1e1c7505fb0eda3171d3a40fd3602a61464e2 /src/libebackend
parent22684323591d3c03116641baef0c35ef8c6da04f (diff)
downloadevolution-data-server-59c43baa15eaedacd1ead99757d50fc9537025c7.tar.gz
Bug 793466 - [evolution-source-registry] Empty .source file causes high CPU usage
Diffstat (limited to 'src/libebackend')
-rw-r--r--src/libebackend/e-collection-backend.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/src/libebackend/e-collection-backend.c b/src/libebackend/e-collection-backend.c
index 2b38ad1f7..4fa459e73 100644
--- a/src/libebackend/e-collection-backend.c
+++ b/src/libebackend/e-collection-backend.c
@@ -210,13 +210,37 @@ collection_backend_new_source (ECollectionBackend *backend,
}
static void
+collection_backend_remove_files (GSList *filenames, /* gchar * */
+ const gchar *cache_dir,
+ const gchar *reason)
+{
+ GSList *link;
+
+ for (link = filenames; link; link = g_slist_next (link)) {
+ const gchar *name = link->data;
+ gchar *filename;
+
+ filename = g_build_filename (cache_dir, name, NULL);
+ if (filename) {
+ if (g_unlink (filename) == -1) {
+ gint errn = errno;
+ e_source_registry_debug_print ("%s: Failed to remove %s source '%s': %s\n", G_STRFUNC, reason, filename, g_strerror (errn));
+ } else {
+ e_source_registry_debug_print ("%s: Removed %s source '%s'\n", G_STRFUNC, reason, filename);
+ }
+ }
+ g_free (filename);
+ }
+}
+
+static void
collection_backend_load_resources (ECollectionBackend *backend)
{
ESourceRegistryServer *server;
ECollectionBackendClass *class;
GDir *dir;
GFile *file;
- GSList *remove_redundant = NULL, *link;
+ GSList *remove_redundant = NULL, *remove_broken = NULL;
const gchar *name;
const gchar *cache_dir;
GError *error = NULL;
@@ -261,6 +285,9 @@ collection_backend_load_resources (ECollectionBackend *backend)
g_warn_if_fail (source == NULL);
g_warning ("%s: %s", G_STRFUNC, error->message);
g_clear_error (&error);
+
+ /* Internal data, broken file for some reason, delete it */
+ remove_broken = g_slist_prepend (remove_broken, g_strdup (name));
continue;
}
@@ -287,23 +314,11 @@ collection_backend_load_resources (ECollectionBackend *backend)
g_object_unref (server);
g_dir_close (dir);
- for (link = remove_redundant; link; link = g_slist_next (link)) {
- const gchar *name = link->data;
- gchar *filename;
-
- filename = g_build_filename (cache_dir, name, NULL);
- if (filename) {
- if (g_unlink (filename) == -1) {
- gint errn = errno;
- e_source_registry_debug_print ("%s: Failed to remove redundant source '%s': %s\n", G_STRFUNC, filename, g_strerror (errn));
- } else {
- e_source_registry_debug_print ("%s: Removed redundant source '%s'\n", G_STRFUNC, filename);
- }
- }
- g_free (filename);
- }
+ collection_backend_remove_files (remove_redundant, cache_dir, "redundant");
+ collection_backend_remove_files (remove_broken, cache_dir, "broken");
g_slist_free_full (remove_redundant, g_free);
+ g_slist_free_full (remove_broken, g_free);
}
static ESource *