[evolution-data-server] Bug 793466 - [evolution-source-registry] Empty .source file causes high CPU usage
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug 793466 - [evolution-source-registry] Empty .source file causes high CPU usage
- Date: Fri, 16 Feb 2018 14:03:16 +0000 (UTC)
commit 59c43baa15eaedacd1ead99757d50fc9537025c7
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]