3 * @brief replacement for GNU tdestroy()
5 /*****************************************************************************
6 * Copyright (C) 2009 RĂ©mi Denis-Courmont
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
27 #if defined(HAVE_SEARCH_H) && !defined(HAVE_TDESTROY)
32 #include <vlc_common.h>
40 } list = { NULL, 0, VLC_STATIC_MUTEX };
42 static void list_nodes (const void *node, const VISIT which, const int depth)
46 if (which != postorder && which != leaf)
49 const void **tab = realloc (list.tab, sizeof (*tab) * (list.count + 1));
50 if (unlikely(tab == NULL))
53 tab[list.count] = *(const void **)node;
62 } smallest = { NULL, VLC_STATIC_MUTEX };
64 static int cmp_smallest (const void *a, const void *b)
68 if (a == smallest.node)
70 if (likely(b == smallest.node))
75 void vlc_tdestroy (void *root, void (*freenode) (void *))
80 assert (freenode != NULL);
82 /* Enumerate nodes in order */
83 vlc_mutex_lock (&list.lock);
84 assert (list.count == 0);
85 twalk (root, list_nodes);
90 vlc_mutex_unlock (&list.lock);
92 /* Destroy the tree */
93 vlc_mutex_lock (&smallest.lock);
94 for (size_t i = 0; i < count; i++)
99 node = tdelete (node, &root, cmp_smallest);
100 assert (node != NULL);
102 vlc_mutex_unlock (&smallest.lock);
103 assert (root == NULL);
105 /* Destroy the nodes */
106 for (size_t i = 0; i < count; i++)
107 freenode ((void *)(tab[i]));