file: Drop deep ref/unref wrappers

Their names are misleading: the list itself is not refcounted.

This misconception is likely how some memory leaks have been
introduced in nautilus_restore_files_from_trash() and in
properties_cb(). Both leaks are therefore fixed as part of
this commit by employing autocleanup in the first case and
stack allocation in the second case.
This commit is contained in:
António Fernandes 2023-07-22 16:20:46 +01:00
parent 167f1b2c92
commit 8ec1244c3e
7 changed files with 10 additions and 71 deletions

View file

@ -1566,10 +1566,8 @@ properties_cb (GtkWidget *widget,
if (file)
{
list = g_list_append (NULL, file);
list = &(GList){file, NULL};
nautilus_properties_window_present (list, widget, NULL, NULL, NULL);
nautilus_file_list_unref (list);
}
}

View file

@ -2271,7 +2271,7 @@ start_monitoring_file_list (NautilusDirectory *directory)
{
g_assert (!directory->details->directory_load_in_progress);
directory->details->file_list_monitored = TRUE;
nautilus_file_list_ref (directory->details->file_list);
g_list_foreach (directory->details->file_list, (GFunc) nautilus_file_ref, NULL);
}
if (directory->details->directory_loaded ||
@ -2324,7 +2324,7 @@ nautilus_directory_stop_monitoring_file_list (NautilusDirectory *directory)
directory->details->file_list_monitored = FALSE;
file_list_cancel (directory);
nautilus_file_list_unref (directory->details->file_list);
g_list_foreach (directory->details->file_list, (GFunc) nautilus_file_unref, NULL);
directory->details->directory_loaded = FALSE;
}

View file

@ -412,18 +412,15 @@ filtering_changed_callback (gpointer callback_data)
void
emit_change_signals_for_all_files (NautilusDirectory *directory)
{
GList *files;
g_autolist (NautilusFile) files = NULL;
files = g_list_copy (directory->details->file_list);
files = nautilus_file_list_copy (directory->details->file_list);
if (directory->details->as_file != NULL)
{
files = g_list_prepend (files, directory->details->as_file);
files = g_list_prepend (files, g_object_ref (directory->details->as_file));
}
nautilus_file_list_ref (files);
nautilus_directory_emit_change_signals (directory, files);
nautilus_file_list_free (files);
}
void

View file

@ -581,11 +581,11 @@ nautilus_restore_files_from_trash (GList *files,
{
NautilusFile *file;
GHashTable *original_dirs_hash;
GList *unhandled_files, *l;
g_autolist (NautilusFile) unhandled_files = NULL;
original_dirs_hash = nautilus_trashed_files_get_original_directories (files, &unhandled_files);
for (l = unhandled_files; l != NULL; l = l->next)
for (GList *l = unhandled_files; l != NULL; l = l->next)
{
g_autofree char *message;
@ -604,8 +604,6 @@ nautilus_restore_files_from_trash (GList *files,
restore_files_ensure_parent_directories (original_dirs_hash, parent_window);
g_hash_table_unref (original_dirs_hash);
}
nautilus_file_list_unref (unhandled_files);
}
typedef struct

View file

@ -8562,31 +8562,6 @@ nautilus_file_list_debug (GList *files)
}
}
/**
* nautilus_file_list_ref
*
* Ref all the files in a list.
* @list: GList of files.
**/
GList *
nautilus_file_list_ref (GList *list)
{
g_list_foreach (list, (GFunc) nautilus_file_ref, NULL);
return list;
}
/**
* nautilus_file_list_unref
*
* Unref all the files in a list.
* @list: GList of files.
**/
void
nautilus_file_list_unref (GList *list)
{
g_list_foreach (list, (GFunc) nautilus_file_unref, NULL);
}
/**
* nautilus_file_list_free
*
@ -8596,8 +8571,7 @@ nautilus_file_list_unref (GList *list)
void
nautilus_file_list_free (GList *list)
{
nautilus_file_list_unref (list);
g_list_free (list);
g_list_free_full (list, (GDestroyNotify) nautilus_file_unref);
}
/**
@ -8609,7 +8583,7 @@ nautilus_file_list_free (GList *list)
GList *
nautilus_file_list_copy (GList *list)
{
return g_list_copy (nautilus_file_list_ref (list));
return g_list_copy_deep (list, (GCopyFunc) nautilus_file_ref, NULL);
}
/**

View file

@ -450,8 +450,6 @@ gboolean nautilus_file_is_thumbnailing (Nautilu
/* Convenience functions for dealing with a list of NautilusFile objects that each have a ref.
* These are just convenient names for functions that work on lists of GtkObject *.
*/
GList * nautilus_file_list_ref (GList *file_list);
void nautilus_file_list_unref (GList *file_list);
void nautilus_file_list_free (GList *file_list);
GList * nautilus_file_list_copy (GList *file_list);
GList * nautilus_file_list_sort_by_display_name (GList *file_list);

View file

@ -22,30 +22,6 @@ test_file_refcount_single_file (void)
g_assert_cmpint (nautilus_directory_number_outstanding (), ==, 0);
}
static void
test_file_refcount_file_list (void)
{
NautilusFile *file_1 = nautilus_file_get_by_uri ("file:///etc");
NautilusFile *file_2 = nautilus_file_get_by_uri ("file:///usr");
GList *list = NULL;
list = g_list_prepend (list, file_1);
list = g_list_prepend (list, file_2);
nautilus_file_list_ref (list);
g_assert_cmpint (G_OBJECT (file_1)->ref_count, ==, 2);
g_assert_cmpint (G_OBJECT (file_2)->ref_count, ==, 2);
nautilus_file_list_unref (list);
g_assert_cmpint (G_OBJECT (file_1)->ref_count, ==, 1);
g_assert_cmpint (G_OBJECT (file_2)->ref_count, ==, 1);
nautilus_file_list_free (list);
g_assert_cmpint (nautilus_directory_number_outstanding (), ==, 0);
}
static void
test_file_check_name_bland (void)
{
@ -121,8 +97,6 @@ main (int argc,
g_test_add_func ("/file-refcount/single-file",
test_file_refcount_single_file);
g_test_add_func ("/file-refcount/file-list",
test_file_refcount_file_list);
g_test_add_func ("/file-check-name/bland",
test_file_check_name_bland);
g_test_add_func ("/file-check-name/trailing-slash",