summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2020-12-21 17:21:28 +0000
committerOndrej Holy <oholy@redhat.com>2021-01-05 08:50:24 +0000
commit4f6013e7344f030da86aeed9d0d2e3b658a1a429 (patch)
tree44593d6c83a6e4370756ec5b00f3f437e5e760c9
parentde4d100359310165f5447e3b55ad9e15a63db72b (diff)
downloadnautilus-4f6013e7344f030da86aeed9d0d2e3b658a1a429.tar.gz
tag-manager: Don't leak singleton references
We are leaking references to the singleton object in multiple places. It's not a problem during runtime, but this means it's not properly finalized when the application quits, leaking the tracker connection, which is detected by valgrind. Add g_autoptr() and g_clear_object() where missing. Also, to prevent future leaks, document nautilus_tag_manager_get() and uniformize its use as either an autovariable initializer or a field initializer.
-rw-r--r--src/nautilus-file-undo-operations.c8
-rw-r--r--src/nautilus-file.c4
-rw-r--r--src/nautilus-files-view.c1
-rw-r--r--src/nautilus-list-view.c1
-rw-r--r--src/nautilus-starred-directory.c8
-rw-r--r--src/nautilus-tag-manager.c13
6 files changed, 18 insertions, 17 deletions
diff --git a/src/nautilus-file-undo-operations.c b/src/nautilus-file-undo-operations.c
index b263a33d3..a6a3b2025 100644
--- a/src/nautilus-file-undo-operations.c
+++ b/src/nautilus-file-undo-operations.c
@@ -1437,9 +1437,7 @@ starred_redo_func (NautilusFileUndoInfo *info,
NautilusFileOperationsDBusData *dbus_data)
{
NautilusFileUndoInfoStarred *self = NAUTILUS_FILE_UNDO_INFO_STARRED (info);
- NautilusTagManager *tag_manager;
-
- tag_manager = nautilus_tag_manager_get ();
+ g_autoptr (NautilusTagManager) tag_manager = nautilus_tag_manager_get ();
if (self->starred)
{
@@ -1465,9 +1463,7 @@ starred_undo_func (NautilusFileUndoInfo *info,
NautilusFileOperationsDBusData *dbus_data)
{
NautilusFileUndoInfoStarred *self = NAUTILUS_FILE_UNDO_INFO_STARRED (info);
- NautilusTagManager *tag_manager;
-
- tag_manager = nautilus_tag_manager_get ();
+ g_autoptr (NautilusTagManager) tag_manager = nautilus_tag_manager_get ();
if (self->starred)
{
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index 3ba887e8d..88b28c61b 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -3476,14 +3476,12 @@ static int
compare_by_starred (NautilusFile *file_1,
NautilusFile *file_2)
{
- NautilusTagManager *tag_manager;
+ g_autoptr (NautilusTagManager) tag_manager = nautilus_tag_manager_get ();
g_autofree gchar *uri_1 = NULL;
g_autofree gchar *uri_2 = NULL;
gboolean file_1_is_starred;
gboolean file_2_is_starred;
- tag_manager = nautilus_tag_manager_get ();
-
uri_1 = nautilus_file_get_uri (file_1);
uri_2 = nautilus_file_get_uri (file_2);
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 4b8502557..1e5d0fd2d 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -3327,6 +3327,7 @@ nautilus_files_view_finalize (GObject *object)
g_cancellable_cancel (priv->starred_cancellable);
g_clear_object (&priv->starred_cancellable);
+ g_clear_object (&priv->tag_manager);
G_OBJECT_CLASS (nautilus_files_view_parent_class)->finalize (object);
}
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 66e3373e2..a4fabb924 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -3743,6 +3743,7 @@ nautilus_list_view_finalize (GObject *object)
g_cancellable_cancel (list_view->details->starred_cancellable);
g_clear_object (&list_view->details->starred_cancellable);
+ g_clear_object (&list_view->details->tag_manager);
g_signal_handlers_disconnect_by_func (list_view->details->tag_manager,
on_starred_files_changed,
diff --git a/src/nautilus-starred-directory.c b/src/nautilus-starred-directory.c
index c1a3fe534..fd41418a4 100644
--- a/src/nautilus-starred-directory.c
+++ b/src/nautilus-starred-directory.c
@@ -568,16 +568,12 @@ nautilus_starred_directory_new ()
static void
nautilus_starred_directory_init (NautilusFavoriteDirectory *self)
{
- NautilusTagManager *tag_manager;
-
- tag_manager = nautilus_tag_manager_get ();
+ self->tag_manager = nautilus_tag_manager_get ();
- g_signal_connect (tag_manager,
+ g_signal_connect (self->tag_manager,
"starred-changed",
(GCallback) on_starred_files_changed,
self);
- self->tag_manager = tag_manager;
-
nautilus_starred_directory_set_files (self);
}
diff --git a/src/nautilus-tag-manager.c b/src/nautilus-tag-manager.c
index 4ed97cbbe..16fbed049 100644
--- a/src/nautilus-tag-manager.c
+++ b/src/nautilus-tag-manager.c
@@ -563,6 +563,16 @@ nautilus_tag_manager_class_init (NautilusTagManagerClass *klass)
G_TYPE_POINTER);
}
+/**
+ * nautilus_tag_manager_get:
+ *
+ * Gets a reference to the tag manager.
+ *
+ * If used to initialize a struct field, make sure to release on finalization.
+ * If used to initialize a local variable, make sure to use g_autoptr().
+ *
+ * Returns: (transfer full): the #NautilusTagManager singleton object.
+ */
NautilusTagManager *
nautilus_tag_manager_get (void)
{
@@ -701,7 +711,7 @@ update_moved_uris_callback (GObject *object,
else
{
g_autolist (NautilusFile) updated_files = NULL;
- g_autoptr (NautilusTagManager) tag_manager = NULL;
+ g_autoptr (NautilusTagManager) tag_manager = nautilus_tag_manager_get ();
for (guint i = 0; i < new_uris->len; i++)
{
@@ -710,7 +720,6 @@ update_moved_uris_callback (GObject *object,
updated_files = g_list_prepend (updated_files, nautilus_file_get_by_uri (new_uri));
}
- tag_manager = nautilus_tag_manager_get ();
g_signal_emit_by_name (tag_manager, "starred-changed", updated_files);
}
}