Optimize g_[s]list_free_full a bit

No need to iterate the list twice.
Proposed by Luiz Augusto von Dentz,
http://bugzilla.gnome.org/show_bug.cgi?id=653935
This commit is contained in:
Matthias Clasen 2011-07-10 20:42:58 -04:00
parent 182ed95861
commit 98b667d052
2 changed files with 19 additions and 9 deletions

View File

@ -212,10 +212,15 @@ g_list_free_1 (GList *list)
*/
void
g_list_free_full (GList *list,
GDestroyNotify free_func)
GDestroyNotify free_func)
{
g_list_foreach (list, (GFunc) free_func, NULL);
g_list_free (list);
while (list)
{
GList *next = list->next;
(*free_func) (list->data);
_g_list_free1 (list);
list = next;
}
}
/**

View File

@ -197,17 +197,22 @@ g_slist_free_1 (GSList *list)
* @list: a pointer to a #GSList
* @free_func: the function to be called to free each element's data
*
* Convenience method, which frees all the memory used by a #GSList, and
* calls the specified destroy function on every element's data.
* Convenience method, which frees all the memory used by a #GSList,
* and calls the specified destroy function on every element's data.
*
* Since: 2.28
**/
*/
void
g_slist_free_full (GSList *list,
GDestroyNotify free_func)
GDestroyNotify free_func)
{
g_slist_foreach (list, (GFunc) free_func, NULL);
g_slist_free (list);
while (list)
{
GSList *next = list->next;
(*free_func) (list->data);
_g_slist_free1 (list);
list = next;
}
}
/**