diff options
author | Milan Crha <mcrha@redhat.com> | 2015-06-18 17:50:27 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2015-06-18 17:50:27 +0200 |
commit | 3738cdcd1b26625ce1a005d0c24b8814c593a7a0 (patch) | |
tree | 4886ddd116948c89c42dbc5a0d41b3b40d0d4109 /libebackend/e-source-registry-server.c | |
parent | aa9e2ca6e454f6a42b5e86d403bb4ef38705892e (diff) | |
download | evolution-data-server-3738cdcd1b26625ce1a005d0c24b8814c593a7a0.tar.gz |
source_registry_server_monitor_changed_cb: Reuse existing source
When available, reuse existing source, thus all the changes are not
done on an object which is immediately freed.
Diffstat (limited to 'libebackend/e-source-registry-server.c')
-rw-r--r-- | libebackend/e-source-registry-server.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/libebackend/e-source-registry-server.c b/libebackend/e-source-registry-server.c index 85c0ca6da..61aa39ab4 100644 --- a/libebackend/e-source-registry-server.c +++ b/libebackend/e-source-registry-server.c @@ -424,9 +424,20 @@ source_registry_server_monitor_changed_cb (GFileMonitor *monitor, if (event_type == G_FILE_MONITOR_EVENT_CREATED) { ESource *source; GError *error = NULL; + gchar *uid; + + uid = e_server_side_source_uid_from_file (file, NULL); + if (!uid) + return; - /* it can return NULL source for hidden files */ - source = e_server_side_source_new (server, file, &error); + source = e_source_registry_server_ref_source (server, uid); + + g_free (uid); + + if (!source) { + /* it can return NULL source for hidden files */ + source = e_server_side_source_new (server, file, &error); + } if (!error && source) { /* File monitors are only placed on directories @@ -438,12 +449,13 @@ source_registry_server_monitor_changed_cb (GFileMonitor *monitor, E_SERVER_SIDE_SOURCE (source), TRUE); e_source_registry_server_add_source (server, source); - g_object_unref (source); } else if (error) { e_source_registry_server_load_error ( server, file, error); g_error_free (error); } + + g_clear_object (&source); } if (event_type == G_FILE_MONITOR_EVENT_DELETED) { |