From: Alexander Larsson Date: Tue, 29 Jan 2008 10:35:38 +0000 (+0000) Subject: Mention need to free returned value in g_file_enumerator_next_files_finish X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=1b0fce2dca7264c65f4f5d0c3b693f0028c5360b;p=dana%2Fcg-glib.git Mention need to free returned value in g_file_enumerator_next_files_finish 2008-01-29 Alexander Larsson * gfileenumerator.c: Mention need to free returned value in g_file_enumerator_next_files_finish docs. Fix leak if g_file_enumerator_next_files_finish() not called. svn path=/trunk/; revision=6408 --- diff --git a/gio/ChangeLog b/gio/ChangeLog index ed1039a0..c8143b7a 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,11 @@ +2008-01-29 Alexander Larsson + + * gfileenumerator.c: + Mention need to free returned value in + g_file_enumerator_next_files_finish docs. + Fix leak if g_file_enumerator_next_files_finish() + not called. + 2008-01-29 Alexander Larsson * gcontenttype.c: diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c index 9c2af06c..22d627da 100644 --- a/gio/gfileenumerator.c +++ b/gio/gfileenumerator.c @@ -336,7 +336,8 @@ g_file_enumerator_next_files_async (GFileEnumerator *enumerator, * * Finishes the asynchronous operation started with g_file_enumerator_next_files_async(). * - * Returns: a #GList of #GFileInfos. + * Returns: a #GList of #GFileInfos. You must free the list with g_list_free + * and unref the infos with g_object_unref when your done with them. **/ GList * g_file_enumerator_next_files_finish (GFileEnumerator *enumerator, @@ -529,6 +530,18 @@ typedef struct { GList *files; } NextAsyncOp; +static void +next_async_op_free (NextAsyncOp *op) +{ + /* Free the list, if finish wasn't called */ + g_list_foreach (op->files, (GFunc)g_object_unref, NULL); + g_list_free (op->files); + + g_free (op); +} + + + static void next_files_thread (GSimpleAsyncResult *res, GObject *object, @@ -573,7 +586,6 @@ next_files_thread (GSimpleAsyncResult *res, } } - static void g_file_enumerator_real_next_files_async (GFileEnumerator *enumerator, int num_files, @@ -591,7 +603,7 @@ g_file_enumerator_real_next_files_async (GFileEnumerator *enumerator, op->files = NULL; res = g_simple_async_result_new (G_OBJECT (enumerator), callback, user_data, g_file_enumerator_real_next_files_async); - g_simple_async_result_set_op_res_gpointer (res, op, g_free); + g_simple_async_result_set_op_res_gpointer (res, op, (GDestroyNotify) next_async_op_free); g_simple_async_result_run_in_thread (res, next_files_thread, io_priority, cancellable); g_object_unref (res); @@ -604,13 +616,16 @@ g_file_enumerator_real_next_files_finish (GFileEnumerator *enumer { GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); NextAsyncOp *op; + GList *res; g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_enumerator_real_next_files_async); op = g_simple_async_result_get_op_res_gpointer (simple); - return op->files; + res = op->files; + op->files = NULL; + return res; } static void