[evolution-data-server/gnome-3-26] Bug 793466 - [evolution-source-registry] Empty .source file causes high CPU usage



commit 77fc0875b4e526edf25adcba723fedafefd8351c
Author: Milan Crha <mcrha redhat com>
Date:   Fri Feb 16 15:03:50 2018 +0100

    Bug 793466 - [evolution-source-registry] Empty .source file causes high CPU usage

 src/libebackend/e-collection-backend.c |   47 +++++++++++++++++++++-----------
 src/libedataserver/e-source.c          |    4 ++-
 2 files changed, 34 insertions(+), 17 deletions(-)
---
diff --git a/src/libebackend/e-collection-backend.c b/src/libebackend/e-collection-backend.c
index 2b38ad1..4fa459e 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 *
diff --git a/src/libedataserver/e-source.c b/src/libedataserver/e-source.c
index 3da1b66..0c95e3b 100644
--- a/src/libedataserver/e-source.c
+++ b/src/libedataserver/e-source.c
@@ -905,7 +905,8 @@ source_notify_dbus_connection_status_cb (EDBusSource *dbus_source,
                                         ESource *source)
 {
        g_mutex_lock (&source->priv->connection_status_change_lock);
-       if (source->priv->connection_status_change == NULL) {
+       if (source->priv->connection_status_change == NULL &&
+           source->priv->initialized) {
                source->priv->connection_status_change = g_idle_source_new ();
                g_source_set_callback (
                        source->priv->connection_status_change,
@@ -2608,6 +2609,7 @@ e_source_changed (ESource *source)
 
        g_mutex_lock (&source->priv->changed_lock);
        if (!source->priv->ignore_changed_signal &&
+           source->priv->initialized &&
            source->priv->changed == NULL) {
                source->priv->changed = g_idle_source_new ();
                g_source_set_callback (


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]