mirror of
https://gitlab.gnome.org/GNOME/nautilus
synced 2024-10-01 05:23:56 +00:00
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:
parent
167f1b2c92
commit
8ec1244c3e
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue